TECH
QUESTION
자주하는 질문답변 입니다.
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 | |||
---|---|---|---|
등록된 코멘트가 없습니다. |