PostgreSQL 11中的并发更新
我有大约10个同时更新一行的查询,所以我想知道它们之间的区别是什么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,那么什么是正确的解决方案?在这两个解决方案中,多事务会发生什么情况?两个版本的效果完全相同,并且都可以防止并发出现异常,因为行在修改之前被锁定 第一种方法更
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;