我有一个并发使用案例:可以随时调用端点,并且应该执行操作。 操作如下所示(当前隔离级别为
现在,如果两个操作在更新方面同时开始,使用
我的问题是当第一个事务中有插入时。例如,当第一个事务锁定
是否有一种方法使此事务在等待后选择最新的快照?
READ COMMITTED
):SELECT * FROM TABLE_A WHERE IS_LATEST=true FOR UPDATE
// DO SOME APP LOGIC TO TEST VALIDITY
// ALL GOES WELL => INSERT OR UPDATE NEW ROW WITH IS_LATEST=TRUE => COMMIT
// OTHERWISE => ROLLBACK (all good not interesting)
现在,如果两个操作在更新方面同时开始,使用
SELECT FOR UPDATE
的方法是可以的。因为两个事务看到的行数相同,一个会更新这些行,第二个事务将等待其轮到SELECT FOR UPDATE
并且状态是有效的。我的问题是当第一个事务中有插入时。例如,当第一个事务锁定
SELECT FOR UPDATE
时,有两行,然后事务继续,在事务进行过程中,第二个事务进来想要选择SELECT FOR UPDATE
(latest),并等待第一个事务完成。第一个事务完成后,在数据库中实际上有一个新的第三个项目,但是第二个事务在等待行锁被释放时仅获取了两行。(这是因为调用SELECT FOR UPDATE
时的快照不同,只有两行符合IS_LATEST=true
)。是否有一种方法使此事务在等待后选择最新的快照?
SERIALIZABLE
或SKIP LOCKED
。 - Mike Organek