首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何避免这种争用情况?

我应该如何避免这种争用情况?
EN

Stack Overflow用户
提问于 2020-12-08 09:37:52
回答 1查看 63关注 0票数 0

我有一段类似下面的代码,为了简洁起见,这段代码被删节了:

代码语言:javascript
复制
        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实例之后释放锁,以确保它们被捆绑在一起。

我试过用芹菜来处理这个问题,但是参数传递不方便。

EN

回答 1

Stack Overflow用户

发布于 2020-12-08 18:21:30

您可以使用.select_for_update()锁定行,直到事务结束。请参阅文档here

代码语言:javascript
复制
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, ...)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65191859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档