gpt4 book ai didi

postgresql - PostgreSQL 11 中的并发更新

转载 作者:行者123 更新时间:2023-12-04 08:32:30 25 4
gpt4 key购买 nike

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

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

SELECT balance FROM account WHERE id = 1 FOR UPDATE;

-- compute $newval = $balance + 1000

UPDATE account SET balance = $newval WHERE id = 1;

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

最佳答案

两个版本将具有完全相同的效果,并且都可以防止在并发时出现异常,因为该行在修改之前已锁定。
第一种方法更可取,因为只有一个客户端-服务器往返,所以事务更短,持有锁的时间更短,提高了并发性。
做到这一点并避免并发数据修改的最佳方法是:

UPDATE account
SET balance = balance + 1000
WHERE id = 1;
这也是一样的,因为 UPDATE自动在受影响的行上放置一个排他锁,当锁消失时,阻塞的查询将看到该行的更新版本。

关于postgresql - PostgreSQL 11 中的并发更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64960570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com