如何使用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进行数据库或表锁定的主要内容,如果未能解决你的问题,请参考以下文章
Pythonwindows下Eclipse中安装集成webpy框架
如何以ms访问形式将mysql中数据库中的数据或表显示为可编辑? (像列表框一样可编辑)