繁体   English   中英

并行事务中的两个并发 INSERT ON CONFLICT UPDATE

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM