即使我没有使用任何显式表锁定,并且我的隔离级别设置为Message: ORA-00060: deadlock detected while waiting for resource
,也会出现此错误READ COMMITTED
。
我在springTransactionTemplate
上使用多个带有默认传播的线程。在我的业务逻辑中,数据是分开的,因此两个事务永远不会有相同的数据集。因此我不需要SERIALIZABLE
为什么Oracle可以检测到死锁?在这个星座里死锁是不可能的,还是我遗漏了什么?如果我没有遗漏任何东西,那么我的分离算法一定是错误的,对吧?或者有其他解释吗?
最佳答案
Oracle默认执行行级锁定。你提到使用多线程。我怀疑一个线程正在锁定一行,然后试图锁定另一个已被另一个线程锁定的行。然后另一个线程试图锁定第一个线程锁定的行。此时,Oracle将自动检测到死锁并将其打破。上面提到的两行可以在同一个表中,也可以在不同的表中。
仔细检查每个线程正在做什么是起点。可能需要决定不并行运行,或者可能需要使用显式的锁定机制(例如,选择用于更新)。
关于你的发现和其他问题…
千