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

问题描述 投票:0回答:1

在以下情况下,我找不到我需要做的事情:事务或锁定或组合?以及如何使用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'

谢谢。

locking mysql-python web.py
1个回答
0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.