并发递增数据库计数器的原子性问题咨询
PostgreSQL多列UPDATE的原子性问题解答
嘿,这个问题问得挺到位的!先给你拍板答案:PostgreSQL的UPDATE原子性绝对不局限于单个整数列的更新场景,你Django ORM生成的那种多列更新查询同样具备完整的原子性。
下面给你拆解下原因:
- PostgreSQL中,整条UPDATE语句是原子执行的——要么所有列的修改全部成功落地,要么遇到异常时全部回滚,绝对不会出现部分列修改生效、部分没生效的中间状态。
- 看你给出的Django生成的查询:
UPDATE "mytable" SET "counter" = ("mytable"."counter" + 1), "owner" = NULL, "updated" = '2018-04-12T12:53:17.826257+00:00'::timestamptz WHERE "mytable"."id" = 27;,这里的三个列修改操作会被当作一个不可分割的整体来执行,并发情况下完全不用担心出现“counter加了但owner没设为NULL”这种半完成的情况。 - 另外针对
counter = counter +1这种自增操作,哪怕和其他列修改一起执行,PostgreSQL的行级锁机制也能保证并发安全:当一个事务更新某行时,会立即锁住该行,其他事务必须等锁释放后才能对该行进行操作,所以不会出现计数丢失的问题。
额外补充个小知识点:PostgreSQL的原子性是语句级别的,不管你在UPDATE里修改多少列、用了多少复杂表达式,只要是同一条UPDATE语句,就都能保证原子性。
内容的提问来源于stack exchange,提问作者planetp
相关产品推荐
相关产品推荐

