锁定表(或使用交易?)进行付款

时间:2015-02-27 08:28:46

标签: python mysql

我有一个类似于以下内容的网络视图:

def process_payment(request, user):
    amount = 'SELECT amount FROM table where user=user'
    PayUser(user, amount)
    return 'OK

问题在于,如果有人请求相同的端点数千次(试图欺骗系统),则user.get_balance()可能会返回相同的值,并且用户将多次获得付款。

我怎样才能设置锁定'为了防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

在这种情况下,有几种方法可以设置锁定。我之前使用的方法如下:修改值的每个工作线程必须在表行上设置工作者GUID,然后检查GUID是否设置为其GUID。只有这样他们才能处理它。在GUID被清除之前,没有其他工作人员可以处理该行,并且仅在处理完成时才进行处理。在工作流程中:

  1. 获取金额,并确保需要支付用户,确保工作人员GUID为空
  2. 工作人员使用GUID
  3. 锁定行
  4. 工人检查GUID匹配,如果没有,则中止
  5. Worker更新该值并将GUID设置为null
  6. 如果行已被锁定超过10分钟,您还可以添加time_locked然后另一个进程将GUID重置为null。这样,如果一个工人失败了,它就会自行纠正。

    由于数据库符合ACID标准,因此可以使用。

    为了生成GUID,请查看uuid库。