gpt4 book ai didi

multithreading - 并发插入和更新 postgres

转载 作者:行者123 更新时间:2023-11-29 12:26:01 26 4
gpt4 key购买 nike

当您在多线程环境中接收到同一字段的并发插入和更新时,是否有解决问题的方法。

例子

线程 1

BEGIN 
insert into users (name,age) values('spiderman',27)
COMMIT

线程 2

BEGIN
update into users set age = 26 where name='spiderman';
COMMIT

大多数时候 update(transaction) 并不知道插入的发生,因此它会抛出错误。

我在这里看到的是竞争条件的经典示例,避免竞争条件的一种方法是使用效果锁。

如何在数据库中尚不存在的记录上应用锁(记录)。

在上面的插入语句示例中,Update 知道该记录还不在 DB 中。

最佳答案

基于锁的解决方案会非常困难,而且可能不值得这么麻烦。您必须找到一种方法来创建一组包含所有可能的“名称”字段的数据,然后围绕该数据创建一个咨询锁系统。它也可能容易出错。

但是,如果问题确实是确保 UPDATEINSERT 之后才会运行,则有更简单的解决方案。

具体来说,我想到的是这样的:

BEGIN;
SELECT count(*) FROM users WHERE name = 'spiderman';
-- on the application side, check to see what the result is
-- if it's 0, ROLLBACK
-- if it's >0:
UPDATE users SET age = 26 WHERE name = 'spiderman';
COMMIT;

如果你最终回滚,你会回来并稍后再试,这是否意味着简单的事情,比如 sleep 10 秒然后重试,或者更复杂的事情,比如把工作项放回去进入队列并继续另一项工作。

如果您担心 SELECTUPDATE 之间发生的更新,您可以 SELECT FOR UPDATE,这将锁定选定的行直到您的交易完成。

关于multithreading - 并发插入和更新 postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36747951/

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