我有一段类似下面的代码,为了简洁起见,这段代码被删节了:
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实例之后释放锁,以确保它们被捆绑在一起。
我试过用芹菜来处理这个问题,但是参数传递不方便。
发布于 2020-12-08 18:21:30
您可以使用.select_for_update()锁定行,直到事务结束。请参阅文档here
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, ...)https://stackoverflow.com/questions/65191859
复制相似问题