單一會話引發的死鎖
客戶環境中出現了ORA-60死鎖錯誤,檢查日誌發現,持有鎖和等待鎖的是同一個會話。
一般來說構成死鎖至少需要兩個會話,而當前的問題是一個會話引發的:
Wed Nov 23 10:19:46 2011
ORA-00060: Deadlock detected. More info in file /oracle/admin/db1/udump/db1_ora_3408686.trc.
對應的詳細資訊:
*** 2011-10-29 10:11:28.970
*** SERVICE NAME:(db1) 2011-10-29 10:11:28.960
*** SESSION ID:(5562.45) 2011-10-29 10:11:28.960
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
TX-000c0016-000499ad 16 5562
X 16 5562 X
session 5562: DID 0001-0010-00000092 session
5562: DID 0001-0010-00000092
Rows waited on:
Session 5562: obj - rowid = 00009050 - AAAJBQAAWAAArQ6AAG
(dictionary objn - 36944, file - 22,
block - 177210, slot - 6)
Information on the OTHER waiting sessions:
End of information on OTHER waiting sessions.
可以看到,等待的和持有鎖的是同一個會話。
根據trace資訊記錄的物件,發現問題是自治事務導致的。
在主事務中如果更新了部分記錄,這是啟動自治事務更新同樣的記錄,就會造成死鎖,下面透過一個簡單的例子模擬了這個錯誤的產生:
SQL> create table t (id number, name varchar2(30));
Table created.
SQL> insert into t select rownum, tname from tab;
4 rows created.
SQL> commit;
Commit complete.
SQL> create or replace procedure
p_test as
2 pragma autonomous_transaction;
3 begin
4 update t set name = name where id = 1;
5 commit;
6 end;
7 /
Procedure created.
SQL> begin
2 update t set name = name where id = 1;
3 p_test;
4 end;
5 /
begin
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
ORA-06512: at "TEST.P_TEST", line 4
ORA-06512: at line 3
在使用自治事務的時候要避免當前事務鎖定的記錄和自治事務中鎖定的記錄相互衝突。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-711881/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQLSERVER 語句交錯引發的死鎖研究SQLServer
- 查詢處理死鎖會話的sql語句(轉貼)會話SQL
- 如何透過sid查詢造成死鎖的sql語句,並殺死會話SQL會話
- 如何通過sid查詢造成死鎖的sql語句,並殺死會話SQL會話
- 兩個會話分別只執行一個SQL,可能形成死鎖嗎會話SQL
- 不合理的執行順序引發的死鎖
- oracle鎖會話Oracle會話
- innodb next-key lock引發的死鎖現象分析
- MySQL:一個死鎖分析 (未分析出來的死鎖)MySql
- mysql鎖與會話MySql會話
- rman會造成delete死鎖嗎delete
- SQ死鎖及死鎖的解決
- 批量kill殺死某些會話session的plsql會話SessionSQL
- [Java併發]避免死鎖Java
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法作業系統演算法
- 關聯v$session,v$locked_object,dba_objects查出鎖死會話及物件SessionObject會話物件
- 分散式死鎖的一個例子分散式
- MySQL:死鎖一例MySql
- 【MySQL】死鎖案例之一MySql
- Oracle死鎖一例(ORA-00060),鎖表導致的業務死鎖問題Oracle
- Java鎖——死鎖Java
- 死鎖
- 面試:什麼是死鎖,如何避免或解決死鎖;MySQL中的死鎖現象,MySQL死鎖如何解決面試MySql
- 關於ejb使用單例方式獲取id時發生的死鎖?單例
- Linux 上分析死鎖的最簡單方法Linux
- 【死磕JVM】一道面試題引發的“棧幀”!!!JVM面試題
- [Java]一個DeadLock(死鎖)的例子Java
- 一個MySQL死鎖問題的反思MySql
- Oracle中的死鎖Dead Lock(一)Oracle
- MySQL死鎖案例一(回滾導致死鎖)MySql
- MySQL:Innodb 一個死鎖案例MySql
- 一句話的翻譯引發的爭論
- MySQL的共享鎖阻塞會話案例淺析MySql會話
- 併發插入引起的死鎖問題排查
- oracle 死鎖發生的測試用例Oracle
- ABAP面試題系列:寫一組會出現死鎖(Deadlock)的ABAP程式面試題
- 鎖賦值給其他變數為什麼會死鎖呢?賦值變數
- 面試官:什麼是死鎖?怎麼排查死鎖?怎麼避免死鎖?面試