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