2011-09-04 68 views
1

即使我没有使用任何明确的表锁,并且我的隔离级别设置为READ COMMITTED,我得到此错误Message: ORA-00060: deadlock detected while waiting for resourceOracle死锁没有显式锁定和读提交隔离级别,为什么?

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

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

+1

当Oracle检测到死锁时,会生成死锁跟踪文件。你能得到这个文件吗(或者要求你的DBA发送给你)?有很多可能性,但死锁跟踪文件会告诉你到底发生了什么。 –

回答

4

Oracle默认进行行级锁定。你提到使用多个线程。我怀疑一个线程正在锁定一行,然后试图锁定另一个线程已锁定的另一个线程。那另一个线程然后试图锁定第一个线程锁定的行。此时,Oracle会自动检测到一个死锁并将其分解。上面提到的两行可以在同一个表中或不同的表中。

仔细检查每个线程正在做什么是一个起点。可能有必要决定不要并行运行,或者可能需要使用显式锁定机制(例如,选择更新)。

LMK的你发现和任何额外的问题...。

ķ

+0

好的,我会尽力找到那个转储。但是从更一般的观点来看:我给出了不相交的线程逻辑卡盘。那么这段代码肯定会被破坏,并且提供一些不会丢失的夹头? –

+0

如果您的每个线程都触及不同的表格,则会使问题更加有趣。从贾斯汀和史蒂夫建议的跟踪文件开始,是下一步最好的一步。 –

1

时碰到死锁无关本身与序列水平。当一行被插入/更新/删除oracle锁定该行时。如果您有两个事务同时运行并试图更改同一行,则可能会遇到死锁。强调“CAN”。如果不同类型的事务以不同顺序锁定,这通常会发生,这是错误事务设计的一个标志。

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

相关问题