如何使用Webpy进行数据库或表锁定

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Webpy进行数据库或表锁定相关的知识,希望对你有一定的参考价值。

在以下情况下,我找不到我需要做的事情:事务或锁定或组合?以及如何使用webpy完成?

我有以下情况:用户通过浏览器登录,该用户可以通过由Web服务器(webpy框架)处理的帖子对数据库进行1次更新。

该用户可能登录多个浏览器以试图绕过我的安全性,因此我想确保当用户发布更新请求时,会发生以下情况:

  • 锁定必需的表
  • 从表中读取数据以确保仍然允许该用户发出此请求
  • 如果不允许用户,请解锁表并返回错误
  • 写入表-为此用户进行请求的更改
  • 写入表-更改用户标志,以便用户无法再次执行此操作
  • 解锁表

使用单线程应用程序时,这只是一个简单的实现。但是由于我使用的是webpy,所以我不确定如何实现此目的。它像运行我自己的命令一样简单吗?还是应该将其包含在单个交易中?还是....?

(伪代码)会像这样简单吗:

class posted():
  def POST(self):
    if userAllowed(): # userAllowed() reads session data that is set during login
      try:
        result=db.query('LOCK TABLES A write ,B write')
      except:            
        return 'DB Locking failed, please notify admin'

      res=db.query( table A for user flag)
      if res is not allowed:
        db.query('UNLOCK TABLES;')
        return 'You are not allowed to do this'

      db.update( table A, update flag to disallow future changes)
      db.update( table B with user request)
      db.query('UNLOCK TABLES;')
      return 'Your request has been handled, thank you.' 
    else:
      return 'You are not authorized to do anything like this'

谢谢。

答案

单个POST()将在一个线程中运行-另一个用户(或另一个浏览器/选项卡中的同一用户)的POST()将在另一个线程或可能独立的进程中运行。

只需将您的项目放入数据库事务中,它就可以执行您想要的操作。

t = db.transaction()
....
t.commit()

并且,当然,用try块包围,并在必要时执行t.rollback()

以上是关于如何使用Webpy进行数据库或表锁定的主要内容,如果未能解决你的问题,请参考以下文章

如何在 webpy 中提供文件?

使用引导程序进行分页的响应式数据表或表

Pythonwindows下Eclipse中安装集成webpy框架

如何以ms访问形式将mysql中数据库中的数据或表显示为可编辑? (像列表框一样可编辑)

webpy使用mysql数据库操作(web.database)

如何在 postgresql 中进行一些未经授权的登录尝试后锁定数据库用户帐户