sha*_*thb 15 oracle trace deadlock
当多个用户正在使用该应用程序时,我的应用程序中经常出现这种"等待资源时检测到ora-00060死锁"的错误.我从oracle Admin获得了跟踪文件,但需要帮助才能阅读它.下面是跟踪文件中的一些数据,我希望这有助于找到原因.
*** 2013-06-25 09:37:35.324
DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a deadlock due
to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 210 72 SX SSX 208 24 SX SSX
TM-000151a2-00000000 208 24 SX SSX 210 72 SX SSX
session 72: DID 0001-00D2-000000C6 session 24: DID 0001-00D0-00000043
session 24: DID 0001-00D0-00000043 session 72: DID 0001-00D2-000000C6
Rows waited on:
Session 72: no row
Session 24: no row
----- Information for the OTHER waiting sessions -----
Session 24:
sid: 24 ser: 45245 audsid: 31660323 user: 90/USER
flags: (0x45) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
flags2: (0x40009) -/-/INC
pid: 208 O/S info: user: zgrid, term: UNKNOWN, ospid: 2439
image: oracle@xyz.local
client details:
O/S info: user: , term: , ospid: 1234
machine: xyz.local program:
current SQL:
delete from EMPLOYEE where EMP_ID=:1
----- End of information for the OTHER waiting sessions -----
Information for THIS session:
----- Current SQL Statement for this session (sql_id=dyfg1wd8xa9qt) -----
delete from EMPLOYEE where EMP_ID=:1
===================================================
Run Code Online (Sandbox Code Playgroud)
如果有人可以告诉我"死锁图::"的含义,我将不胜感激.在节上等待的行也表示没有行.
我还在一些博客中读到跟踪文件中的"sqltxt"部分可以提示原因.以下是我在该部分中看到的查询.
select /*+ all_rows */ count(1) from "USERS"."EMPLOYEE_SALARY" where EMPSAL_EMP_ID=:1
Run Code Online (Sandbox Code Playgroud)
employee_salary表在EMPSAL_EMP_ID列上具有外键约束.
sql提示说"all_rows",这是否意味着该表在从employee表中删除记录时会获得表级锁定?我目前没有外键列的索引.在此列上添加索引会有帮助吗?
请发布,以防需要更多信息.
谢谢
Thi*_*Jet 30
首先,select语句永远不会锁定Oracle中的任何内容,只使用最后一次可用的一致数据版本.从Oracle 9i开始,select ... for update锁定数据的情况并非如此update,但for update查询中没有任何条款.
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 210 72 SX SSX 208 24 SX SSX
Run Code Online (Sandbox Code Playgroud)
会话#72保持具有"行独占"类型(SX)的表级锁(TM)并且想要在同一表上获取"共享行独占"(SSX)锁.会话#24阻止此会话已经保持相同类型(SX)的表级锁定,并在SSX锁定可用时等待.
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 208 24 SX SSX 210 72 SX SSX
Run Code Online (Sandbox Code Playgroud)
这(第二行)演示完全相同的情况,但方向相反:会话#24等待SSX锁定变为可用,但被会话#72阻止,该会话已经在同一个表上保持SX锁定.
因此,会话#24和会话#72相互阻塞:发生死锁.
两种锁类型(SX和SSX)都是表级锁.
为了解这种情况,我建议您阅读Franck Pachot撰写的这篇文章.
以下是本文引用的内容,与您的情况直接相关(请注意,SSX和SRX缩写是等效的):
参照完整性也获得TM锁.例如,当您在父表上发出删除或更新密钥时,未编制索引的外键的常见问题会导致子表上的S锁定.这是因为没有索引,Oracle没有单个较低级别的资源可以锁定,以防止可能违反参照完整性的并发插入.
当外键列是常规索引中的前导列时,具有父值的第一个索引条目可以用作单个资源并使用行级TX锁定锁定.
如果参照完整性有删除级联怎么办?除了S模式之外,还有更新子表中的行的意图,与行X(RX)模式一样.这是共享行独占(SRX)发生的地方:S + RX = SRX.
因此,最可能的变体是会话#72和会话#24同时删除EMPLOYEE表中的某些行,并且在第一列列出的表的表上缺少索引时存在on delete cascade约束.EMPSAL_EMP_IDEMPLOYEE_SALARYEMPSAL_EMP_ID