我有大约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,那么什么是正确的解决方案,在这两个解决方案中多事务会发生什么?
发布于 2020-11-23 07:21:22
这两个版本将具有完全相同的效果,并且都可以防止并发时出现异常,因为行在被修改之前就被锁定了。
第一种方法更可取,因为只有一次客户端-服务器往返,因此事务更短,锁持有的时间也更短,这提高了并发性。
要做到这一点并避免并发数据修改,最好的方法是:
UPDATE account
SET balance = balance + 1000
WHERE id = 1;这也是一样的,因为UPDATE会自动在受影响的行上放置一个排它锁,当锁消失时,被阻塞的查询将看到该行的更新版本。
https://stackoverflow.com/questions/64960570
复制相似问题