Oracle死锁没有显式锁定和读提交隔离级别,为什么



我得到这个错误Message: ORA-00060: deadlock detected while waiting for resource,即使我没有使用任何显式表锁定和我的隔离级别设置为READ COMMITTED

我在Spring TransactionTemplate上使用多个线程默认传播。在我的业务逻辑中,数据是分开的,因此两个事务永远不会有相同的数据集。因此我不需要SERIALIZABLE

为什么Oracle可以检测到死锁?死锁在这个星座里是不可能的,还是我错过了什么?如果我没有漏掉任何东西那么我的分离算法一定是错的,对吧?或者会有其他的解释吗?

Oracle默认使用行级锁。您提到了使用多线程。我怀疑一个线程正在锁定一行,然后试图锁定另一个被另一个线程锁定的行。然后,另一个线程试图锁定第一个线程锁定的行。此时,Oracle将自动检测死锁并打破它。上面提到的两行可以在同一个表中,也可以在不同的表中。

仔细检查每个线程正在做的事情是起点。可能有必要决定不并行运行,或者可能有必要使用显式锁定机制(例如,select for update)。

你发现了什么,还有什么问题吗....

K

遇到死锁本身与序列化级别无关。当插入/更新/删除一行时,oracle会锁定该行。如果有两个事务并发运行,并且试图更改同一行,则可能会遇到死锁。重点在"CAN"上。如果不同类型的事务以不同的顺序获取锁,通常会发生这种情况,这是糟糕的事务设计的标志。

如前所述,在遇到死锁时生成跟踪文件。如果查看跟踪文件,就可以确定死锁涉及到哪两个会话。此外,它还显示了相应的SQL语句。

最新更新