PostgreSQL 11中的并发更新

PostgreSQL 11中的并发更新,postgresql,concurrency,transactions,postgresql-11,Postgresql,Concurrency,Transactions,Postgresql 11,我有大约10个同时更新一行的查询,所以我想知道它们之间的区别是什么 UPDATE account SET balance = balance + 1000 WHERE id = (SELECT id FROM account where id = 1 FOR UPDATE); 及 我使用的是PosgreSQL 11,那么什么是正确的解决方案?在这两个解决方案中,多事务会发生什么情况?两个版本的效果完全相同,并且都可以防止并发出现异常,因为行在修改之前被锁定 第一种方法更

我有大约10个同时更新一行的查询,所以我想知道它们之间的区别是什么

UPDATE account SET balance = balance + 1000
WHERE id = (SELECT id FROM account
            where id = 1 FOR UPDATE);


我使用的是PosgreSQL 11,那么什么是正确的解决方案?在这两个解决方案中,多事务会发生什么情况?

两个版本的效果完全相同,并且都可以防止并发出现异常,因为行在修改之前被锁定

第一种方法更可取,因为只有一个客户机-服务器往返,因此事务更短,锁的持有时间更短,从而提高了并发性

做到这一点并避免并发数据修改的最佳方法是:

UPDATE account
SET balance = balance + 1000
WHERE id = 1;

这也是一样的,因为一个
更新
会自动在受影响的行上放置一个排他锁,当锁消失时,一个被阻止的查询将看到该行的更新版本。

谢谢你的回答,但我刚刚读了一篇关于此案例并发性的文档,所以我非常困惑。。。这不是PostgreSQL中的情况,请参见下一张幻灯片<代码>读取提交是默认隔离级别。我会更新答案的。顺便说一下,这些幻灯片已经过时了。Tom谈论的另一个隔离级别称为
可重复读取
,而不是今天的
可序列化
。除此之外,还需要仔细阅读。是的,因为语句更简单。这同样有效,因为将使用更新的值重新检查条件。
UPDATE account
SET balance = balance + 1000
WHERE id = 1;