首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发插入和更新postgres

并发插入和更新postgres
EN

Stack Overflow用户
提问于 2016-04-20 23:06:33
回答 1查看 4.3K关注 0票数 2

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

示例

线程1

代码语言:javascript
复制
BEGIN 
insert into users (name,age) values('spiderman',27)
COMMIT

线程2

代码语言:javascript
复制
BEGIN
 update into users set age = 26 where name='spiderman';
COMMIT

大多数情况下,更新(事务)并不知道插入操作的发生,因此它会抛出错误。

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

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

在上面的for insert语句示例中,以便Update知道记录还不在数据库中。

EN

回答 1

Stack Overflow用户

发布于 2016-04-21 01:50:17

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

然而,如果问题真的是确保UPDATEINSERT之后才能运行,那么有更简单的解决方案。

具体来说,脑海中浮现的是这样的东西:

代码语言:javascript
复制
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,它将锁定选定的行,直到您的事务完成。

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

https://stackoverflow.com/questions/36747951

复制
相关文章

相似问题

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