为付款人锁定表(或使用事务?)

2022-07-06 11:35:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我如何设置“锁”来防止这种情况发生


Tags: from视图webreturnrequestdeftableokpaymentwhereprocessselectamountuserpayuser
1条回答
网友
1楼 ·

在此实例中,有几种方法可以设置锁。我以前的工作方式如下:修改值的每个工作线程都必须在表行上设置工作线程GUID,然后检查GUID是否设置为它们的GUID。只有这样他们才能处理它。在清除GUID之前,任何其他工作进程都无法处理该行,并且只有在处理完成后才能执行此操作。在工作流中:

  1. 获取金额并查看需要向用户支付的费用,确保工作人员GUID为空
  2. 辅助进程使用GUID锁定行
  3. 工作进程检查GUID是否匹配,如果不匹配,则中止
  4. Worker更新该值并将GUID设置为null

您还可以添加一个时间锁定,然后添加另一个进程,以便在某行被锁定超过10分钟时将GUID重置为null。这样,如果一个工人失败了,他就会自我纠正

因为数据库是ACID兼容的,所以这将起作用

要生成GUID,请查看uuid库