为了避免读 - 修改 - 写周期(https://blog.2ndquadrant.com/postgresql-anti-patterns-read-modify-write-cycles/),我使用支持表(increment
),该表增加并返回各种唯一键的唯一值;与日志表结合使用,该日志表使用唯一递增值记录具有特定增量键的条目:
WITH increment_result AS
(UPDATE increment SET value = value + 1 WHERE key = 'my_key' RETURNING value)
INSERT INTO log (text, increment) VALUES ('my_text', (SELECT value FROM increment_result))
在并行且负载较重的环境中,查询会不时失败:
PostgresException:21000:用作表达式的子查询返回的多行
我无法理解为什么会发生这种情况,因为increment.key
是现有且独特的。但是我怀疑它与并发有关?
为什么会发生这种情况的想法,或者保证唯一增量值的方法?