我的 django 项目中有这个accounts
模型,它存储了所有用户的账户余额(可用资金)。几乎每次从用户账户中扣除金额之前都会进行金额检查,即检查用户是否有 x 金额或更多金额。如果是,请继续扣除金额。
account = AccountDetails.objects.get(user=userid)
if int(account.amount) >= fare:
account.amount = account.amount-fare
account.save()
现在我想在第一.get()
条语句中加一个锁,这样就可以避免竞争条件。用户发出两次请求,应用程序同时执行上述代码两次,导致其中一个请求覆盖另一个请求。
我发现select_for_update()完全符合我的要求。它锁定行直到事务结束。
account = AccountDetails.objects.select_for_update().get(user=userid)
但它仅在 Django 1.4 或更高版本中可用,我仍在使用 Django 1.3,现在无法迁移到新版本。任何想法如何在我目前的 Django 版本中实现这一点?