You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Django基于数据库值递增字段?规避竞态条件

Django原子计数递增方案(解决竞态条件)

Django完全支持你需要的原子更新操作,无需修改count字段的定义,使用内置的F表达式即可实现。

正确实现方式

from django.db.models import F

class CacheMetaData(models.Model):
    count = models.IntegerField(default=0)

    def inc(self):
        # 通过F表达式直接在数据库层面执行递增,避免内存层面的竞态
        CacheMetaData.objects.filter(id=self.id).update(count=F('count') + 1)
        # 可选:同步当前实例的count值,若后续要在代码中使用最新值
        self.refresh_from_db(fields=['count'])

对应的SQL语句

使用F表达式后,Django会生成你期望的原子更新SQL:

UPDATE the_table SET count = count + 1 WHERE id = 1;

这个操作由数据库原子执行,不会出现多个请求同时读取旧值导致的计数错误。

原代码的问题根源

你之前的实现是先将count值读到内存中(self.count +=1),再写回数据库,这种方式在并发场景下会出现竞态条件——多个请求可能同时读取到同一个旧值,最终更新后的结果会小于实际递增次数。

内容的提问来源于stack exchange,提问作者TieDad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 17:17:34