关于“死锁图”(Deadlock Graph)的一点浅见
当 Oracle 检测到死锁时,检测到死锁的会话中的当前 SQL 将被取消,并执行“语句级回滚”,以释放资源并避免阻塞所有活动。
检测到死锁的会话仍然“存活”,并且事务的其余部分仍然处于活动状态。如果您在该会话中重复上次(被取消的)操作,那么您将再次遇到死锁。
当检测到此类死锁时,会生成一个trace文件,其中包含“死锁图”(以及其他有用信息)。
通过对大量服务请求的审查,我们发现最常见的死锁类型可以通过一个“特征”死锁图来识别,该图可用于确定所遇到的死锁的“类型”。
本文将展示每种类型的示例,以便调查和解决工作能够沿着正确的方向进行。
这篇文章将说明如何利用由 ORA-00060 错误生成的“死锁图”(Deadlock Graph)来识别根本问题。
一个典型的死锁图可能看起来像这样:
为了区分不同的类型,我们采用了锁类型以及持有者和等待者所持有的/等待的模式,并以此为每个类型创建了一个签名。
例如,前面的图表显示了以下特征:
- 死锁图中多于 1 行
- 所有锁类型均为排他锁(TX)
- 持有者和等待者的锁模式均为 X(独占模式,模式 6)
通过关注图表中的这些特定特征:
将给我们以下类型(这通常是应用程序死锁):
TX X X Tx x x
TX X X Tx x x
请注意,对于死锁类型识别而言,“关键签名”中最重要的部分是锁类型以及它所请求的模式。主要类型在下表中已突出显示。
最常见的类型有:
Oracle 锁模式有
0 - none 0—无
1 - null (NULL) 1 - null (null)
2 - 行共享,也称为子共享表锁(SS)
3 - 行排他表锁,也称为子排他表锁(SX)
4 - 共享表锁(S)
5 - 共享行排他锁,也称为共享子排他表锁(SSX)
6 -排他(X)
注意:通常我们会看到应用程序死锁的“特征”与其他特征之一的组合,而不是“典型”的重复特征。例如,您可能会看到类似这样的内容:
死锁图---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-XXXXXXXX-00000000 11 333 SX 22 44 SX SSX
TX-XXXXXXXX-XXXXXXXX 22 44 X 11 333 X
这是“应用程序死锁”和“外键(FK)约束缺失索引”死锁的组合。在这种情况下,建议先解决非“TX X X”的症状,因为不太常见的 FK/ITL/位图签名更有可能是根本原因,而不是应用程序死锁。
请注意,trace 文件包含各种相关信息,这些信息可能与问题有关,也可能无关,这取决于死锁的类型。
例如,在“Rows Waited on”部分,“dictionary objn”值在某些情况下可用于识别相关对象,但在其他情况下可能指向完全不相关的信息。
如果信息可用,会在相关部分注明,否则请勿依赖。
关于锁定模式和锁定的更多内容请见下文:
Oracle® Database Concepts
12c Release 1 (12.1)
E17633-20
Chapter 9 Data Concurrency and Consistency
https://docs.oracle.com/database/121/CNCPT/consist.htm#CNCPT020
参考文档
Document 1552194.1 ORA-00060 Deadlock Graph Not Matching any Examples: Suggested Next Steps
Document 60.1 Troubleshooting Assistant: Oracle Database ORA-00060 Errors on Single Instance (Non-RAC) Diagnosing Using Deadlock Graphs in ORA-00060 Trace Files
How to Identify ORA-00060 Deadlock Types Using Deadlock Graphs in Trace (Doc ID 1507093.1)
Document 1559695.1 How to Diagnose Different ORA-00060 Deadlock Types Using Deadlock Graphs in Trace