Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-15
제목 deadlock
Deadlock이란?
=============
deadlock은 session(A)가 다른 유저 session(B)에 의해 잡고있는 resource를
원할 때 발생하며 이 때 session (B)도 이미 첫번 째 session (A)에 의해 잡혀
있는 resource를 원하는 상황에서 발생한다. 이러한 deadlock은 2개 이상의
session이 관련되어 있으며 기본적인 생각은 같다.

Deadlock 예제
=============
다음에 deadlock의 예제를 간단히 보여줄 것이며 만약 oralce 7을 사용하면
rowid가 다르게 보일 것이다.

Setup: create table eg_60 ( num number, txt varchar2(10) );
insert into eg_60 values ( 1, 'First' );
insert into eg_60 values ( 2, 'Second' );
commit;
select rowid, num, txt from eg_60;

ROWID NUM TXT
------------------ ---------- ----------
AAAAv2AAEAAAAqKAAA 1 First
AAAAv2AAEAAAAqKAAB 2 Second

Ses#1: update eg_60 set txt='ses1' where num=1;

Ses#2: update eg_60 set txt='ses2' where num=2;
update eg_60 set txt='ses2' where num=1;

> Ses#2는 Ses#1에 의한 TX lock을 기다리고 있다.

Ses#1: update eg_60 set txt='ses1' where num=2;

> 이 문장은 Ses#1이 Ses#2에 의해 잡혀있는 TX lock을
wait하도록 함
> 그러나 Ses#2는 이미 Ses#1이 잡고 있는 resource를
wait하고 있음.
> 이러한 상황은 deadlock을 발생시킴.
> This update would cause Ses#1 to wait on the TX lock

> held by Ses#2, but Ses#2 is already waiting on this
session.
> This causes a deadlock scenario so one of the
sessions
> signals an ORA-60.

Ses#2: ORA-60 error

Ses#1: Ses#2가 commit이나 rollback을 할 때까지 block되어 있게
된다.
왜냐하면 ora-60은 단지 current statement만
rollback시켜 주기 때문이다.


Diagnostic information produced by ORA-60

ora-60 error가 alert log에 어떤 정보를 남겨주지는 않지만 ora-60에 관한
정보를 USER_DUMP_DEST 디렉토리 내에 관련된 trace file을 남기게 된다.
이러한 trace file은 deadlock graph와 추가적인 정보를 갖게 되며 그 내용은
다음과 같다.


-----------------------------------------------------------------------
DEADLOCK DETECTED
Current SQL statement for this session:
update eg_60 set txt='ses2' where num=1

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-00020012-0000025e 12 11 X 11
10 X
TX-00050013-0000003b 11 10 X 12
11 X
session 11: DID 0001-000C-00000001 session 10: DID
0001-000B-00000001
session 10: DID 0001-000B-00000001 session 11: DID
0001-000C-00000001
Rows waited on:
Session 10: obj - rowid = 00000BF6 - AAAAv2AAEAAAAqKAAB
Session 11: obj - rowid = 00000BF6 - AAAAv2AAEAAAAqKAAA

-----------------------------------------------------------------------


What does the trace information mean ?

여기서는 위에서 언급된 부분을 설명한다.

-----------------------------------------------------------------------
DEADLOCK DETECTED
Current SQL statement for this session:
update eg_60 set txt='ses2' where num=1

-----------------------------------------------------------------------
이것은 ora-60 error message를 받을 당시 수행되었던 sql 문장을 보여준다.
따라서 이 문장은 ora-60과 동시에 rollback된다.

-----------------------------------------------------------------------
Deadlock graph:
---------Blocker(s)--------
---------Waiter(s)---------
Resource Name process session holds waits process session holds
waits
TX-00020012-0000025e 12 11 X 11
10 X
TX-00050013-0000003b 11 10 X 12
11 X
-----------------------------------------------------------------------

이것은 각 lock을 잡고있는 것과 기다리는 것을 보여준다.

Resource Name Lock name being held / waited for.
process V$PROCESS.PID of the Blocking / Waiting session
session V$SESSION.SID of the Blocking / Waiting session
holds Mode the lock is held in
waits Mode the lock is requested in

그러므로

SID 11은 TX-00020012-0000025e 를 X mode로 잡고 있으며
TX-00050013-0000003b 를 X mode로 잡으려 하고 있다.

SID 10은 TX-00050013-0000003b 를 X mode로 잡고 있으며
TX-00020012-0000025e 를 X mode로 잡으려 하고 있다.


-----------------------------------------------------------------------
Rows waited on:
Session 10: obj - rowid = 00000BF6 - AAAAv2AAEAAAAqKAAB
Session 11: obj - rowid = 00000BF6 - AAAAv2AAEAAAAqKAAA

-----------------------------------------------------------------------

위의 예에서

SID 10 은 object 0xBF6(3062 in decimal)의 ROWID 'AAAAv2AAEAAAAqKAAB'를
waiting하고 있다.

SID 11 은 object 0xBF6의 ROWID 'AAAAv2AAEAAAAqKAAA'를 waiting하고 있다.

이러한 정보는 정확한 row를 보여줄 수 있다.
Eg: SID 10은 다음의 object를 waiting하고 있다.

SELECT owner, object_name, object_type
FROM dba_objects WHERE object_id = 3062;

Owner Object_Name Object_Type
------- --------------- ---------------
SYSTEM EG_60 TABLE


SELECT * FROM system.eg_60 WHERE ROWID='AAAAv2AAEAAAAqKAAB';

NUM TXT
---------- ----------
2 Second


Reference Documents
-------------------


Comment
등록된 코멘트가 없습니다.