首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL 11中的并发更新

PostgreSQL 11中的并发更新
EN

Stack Overflow用户
提问于 2020-11-23 07:05:13
回答 1查看 391关注 0票数 2

我有大约10个并发更新一行的查询,所以我想知道

代码语言:javascript
复制
UPDATE account SET balance = balance + 1000
WHERE id = (SELECT id FROM account
            where id = 1 FOR UPDATE);

代码语言:javascript
复制
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,那么什么是正确的解决方案,在这两个解决方案中多事务会发生什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-23 07:21:22

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

第一种方法更可取,因为只有一次客户端-服务器往返,因此事务更短,锁持有的时间也更短,这提高了并发性。

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

代码语言:javascript
复制
UPDATE account
SET balance = balance + 1000
WHERE id = 1;

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64960570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档