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