我使用的是 postgres 14.2。我在我的服务中使用 jooq 和 spring-boot。
我有一个表 user,其中对 user_id、created_on 有唯一约束,如果 user_id、created_on 的值已经存在,则必须更新该值,否则插入。我选择了以下查询来实现此目的
在冲突(user_id,created_on)时插入用户(?,?,?...)更新设置column1 =?和....
现在,当两个事务尝试执行上述操作时,可能会出现一种情况:两个事务都无冲突并且都尝试插入,其中一个事务失败。如何处理这种竞争条件,其中一个事务必须等待如果其他事务获得插入调用。因此,两个事务都应该成功,顺序并不重要,因为当我面临这种竞争条件时,每个事务都会更新不同的列。
询问法学硕士给了我使用咨询锁的答案。
有什么优雅的方法来处理这种情况吗?在我的查询选择中,有更好的锁定机制。我最近经常遇到这些问题。
有了
INSERT ... ON CONFLICT
,你所描述的情况就永远不会发生。即使其中两个语句完全相同地运行,只有其中一个最终不会发生冲突,而另一个将更新第一个语句创建的行。