我有一个类似于以下内容的网络视图:
def process_payment(request, user):
amount = 'SELECT amount FROM table where user=user'
PayUser(user, amount)
return 'OK
问题在于,如果有人请求相同的端点数千次(试图欺骗系统),则user.get_balance()
可能会返回相同的值,并且用户将多次获得付款。
我怎样才能设置锁定'为了防止这种情况发生?
答案 0 :(得分:1)
在这种情况下,有几种方法可以设置锁定。我之前使用的方法如下:修改值的每个工作线程必须在表行上设置工作者GUID,然后检查GUID是否设置为其GUID。只有这样他们才能处理它。在GUID被清除之前,没有其他工作人员可以处理该行,并且仅在处理完成时才进行处理。在工作流程中:
如果行已被锁定超过10分钟,您还可以添加time_locked然后另一个进程将GUID重置为null。这样,如果一个工人失败了,它就会自行纠正。
由于数据库符合ACID标准,因此可以使用。
为了生成GUID,请查看uuid库。