![](/img/trans.png)
[英]How to handle two insert on conflict do update parallel postgres queries
[英]Two concurrent INSERT ON CONFLICT UPDATE in parallel transactions
一个表最初不包含 id=1 的记录。
2 次交易后的结果:
(1) -------------B+++++++++++++++++++++++C------------------------->
(2) --------------------B+++++++++++++++++++++++C------------------>
第一个事务包含 UPSERT 用于 id=1 的行
INSERT INTO some_table (id, amount) VALUES (1, 10)
ON CONFLICT DO
UPDATE some_table SET amount=amount+10 WHERE id=1;
第二笔交易包含类似的交易:
INSERT INTO some_table (id, amount) VALUES (1, 20)
ON CONFLICT DO
UPDATE some_table SET amount=amount+20 WHERE id=1;
会有什么结果?
作为后续问题,在这种情况下它将如何工作?
(1) -------------B+++++++++++++++++++++++++++++++++++C------------->
(2) --------------------B+++++++++++++++++++++++C------------------>
结果总是一样的: 30 将被添加到amount
。 没有竞争条件。
原因是更新所占用的行锁序列化了UPDATE
操作,所以后面的更新只有在更新较早的事务被提交时才能开始,被阻塞的事务会看到另一个事务的提交结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.