oracle - oracle原子锁对JDBC批更新的所有行的锁定

  显示原文与译文双语对照的内容

我有两个线程在一个表上运行并发更新,类似于:


CREATE TABLE T (


 SEQ NUMBER(10) PRIMARY KEY,


 VAL1 VARCHAR2(10),


 VAL2 VARCHAR2(10)


)



表包含大量的更新,其中的更新类似于:


UPDATE T SET VAL1 =? WHERE SEQ <?


UPDATE T SET VAL2 =? WHERE SEQ =?



两条语句都在两个不同的事务中运行,因为JDBC批处理更新为 1000行。 这样做,我遇到了 ORA-00060: deadlock detected while waiting for resource fairly quickly. 我假设两个事务都会部分影响同一行,这两个事务在它的他行之前锁定一些行。

有没有办法通过锁定原子来避免这种情况,还是需要在两个线程之间引入某种形式的显式锁定?

时间:

在更新记录时,会使用锁来防止脏写,这会损害原子性。

但是,在你的情况下,你可以使用 。 这样,在尝试进行更新之前,您尝试使用SKIP LOCKED获取for UPDATE锁。 这将允许你锁定计划修改的记录并跳过它的他并发事务已经锁定的记录。

在我的高性能Java持久性GitHub存储库中查看 SkipLockJobQueueTest of,以了解如何使用跳行锁定。

有关跳过锁的更多细节, 请查看本文

...