处理事务之间的竞争条件

问题描述 投票:0回答:1

我使用的是 postgres 14.2。我在我的服务中使用 jooq 和 spring-boot。

我有一个表 user,其中对 user_id、created_on 有唯一约束,如果 user_id、created_on 的值已经存在,则必须更新该值,否则插入。我选择了以下查询来实现此目的

在冲突(user_id,created_on)时插入用户(?,?,?...)更新设置column1 =?和....

现在,当两个事务尝试执行上述操作时,可能会出现一种情况:两个事务都无冲突并且都尝试插入,其中一个事务失败。如何处理这种竞争条件,其中一个事务必须等待如果其他事务获得插入调用。因此,两个事务都应该成功,顺序并不重要,因为当我面临这种竞争条件时,每个事务都会更新不同的列。

询问法学硕士给了我使用咨询锁的答案。

有什么优雅的方法来处理这种情况吗?在我的查询选择中,有更好的锁定机制。我最近经常遇到这些问题。

postgresql transactions locking race-condition
1个回答
0
投票

有了

INSERT ... ON CONFLICT
,你所描述的情况就永远不会发生。即使其中两个语句完全相同地运行,只有其中一个最终不会发生冲突,而另一个将更新第一个语句创建的行。

© www.soinside.com 2019 - 2024. All rights reserved.