django - 我应该如何避免这种竞争条件?
问题描述
我有一段如下代码,为简洁起见被截断:
bargained_count = BargainLog.objects.filter(bargain_start_log=bargain_start_log).count()
...
money = calc_single_bargain_money(
bargained_count=bargained_count,
......
)
...
BargainLog.objects.create(bargain_start_log=bargain_start_log, money=money, ...)
bargained_count
是 func 的参数calc_single_bargain_money
。但是,由于比赛条件,我不确定这是否是一种比赛条件。我可能会bargained_count
在高并发下获得相同的值,这会影响calc_single_bargaiN_money
. 所以,我应该如何避免它,请给我一些建议。
就像在多线程中一样,我想在获取之前添加一个锁,bargained_count
并在创建新实例之后释放锁,BargainLog
以确保它们捆绑在一起。
我曾尝试使用 celery 来处理这个问题,但由于参数传递导致它不方便。
解决方案
您可以使用.select_for_update()
锁定行直到事务结束。在此处查看文档
from django.db import transaction
bargain_logs = BargainLog.objects.filter(bargain_start_log=bargain_start_log).select_for_update()
with transaction.atomic():
bargained_count = bargain_logs.count()
...
money = calc_single_bargain_money(
bargained_count=bargained_count,
......
)
...
BargainLog.objects.create(bargain_start_log=bargain_start_log, money=money, ...)
推荐阅读
- android - Jetpack Compose 和 Android Room 兼容性
- javascript - 我对从 webapi 到 angularjs 和 html 的 get 方法有疑问
- mysql - 查询:等于值不等于
- javascript - 如何在three.js中移动其位置时保持相机旋转指向原点?
- python - 复制文件夹和子文件夹,但仅使用 python 复制子文件夹中的第一个文件
- git - Git 尝试提交到 github 时抛出错误
- r - 基于数据框和向量之间的部分匹配过滤行
- python - 如何在另一列中保留最常出现的重复值
- angular - 我安装“@angular/cdk”并在导入 DragDropModule 时出错,我做错了什么?
- formula - 如何建立一个公式来隔离 Netsuite 中应收账款账龄的贷记金额?