2012-11-15 5 views
3

Oracle Database 11g Enterprise Edition 릴리스 11.2.0.1.0이 있습니다. 부모 테이블 t1과 t2에 t1 (col1)을 참조하는 외래 키가 있습니다. 제가 궁금해하는 점은 잠금이있는 이유입니까? 오류 대신 부모 테이블에서 삭제시 잠금

세션 ... 내가 무슨 짓을했는지 확인하시기 바랍니다 1

SQL> create table t1(col1 char(1), primary key(col1)); 
Table created. 

SQL> insert into t1 values('1'); 
1 row created. 
SQL> insert into t1 values('2'); 
1 row created. 
SQL> insert into t1 values('3'); 
1 row created. 
SQL> insert into t1 values('4'); 
1 row created. 
SQL> insert into t1 values('5'); 
1 row created. 

SQL> commit; 
Commit complete. 


SQL> create table t2(col1 char(1), col2 char(2), foreign key(col1) references t1(col1)); 
Table created. 

SQL> insert into t2 values('1','0'); 
1 row created. 
SQL> commit; 
Commit complete. 

SQL> update t2 set col2='9'; --not committed yet! 
1 row updated. 

세션 2

SQL> delete from t1; -- Lock happens here!!! 

세션 1

SQL> commit; 
Commit complete.   

세션 2

delete from t1   -- The error occurs after I commit updating query in session 1. 
* 
ERROR at line 1: 
ORA-02292: integrity constraint (KMS_USER.SYS_C0013643) violated - child record found 

왜 이런 일이 일어 났는지 설명 할 수 있습니까?

답변

3

delete from t1;은 자식 테이블 T2를 잠급니다. 세션이 전체 테이블 잠금을 기다리고 있으면 아직 아무것도 삭제하려고 시도 할 수 없습니다.

이 비정상적인 잠금 동작은 사용자가 unindexed foreign key이므로 발생합니다.

create index t2_idx on t2(col1); 색인을 만들면 잠금 대신 ORA-02292 오류가 발생합니다.

+0

조언 해 주셔서 감사합니다 ... 내가 잠금 장치에 대해 읽을 수있는 참조가 있습니까? – KIM

+0

[데이터베이스 개념 설명서] (http://docs.oracle.com/cd/E11882_01/server.112/e25789/consist.htm#i5704)로 시작하는 것이 좋습니다. –

0

잠금은 행에서오고있다 : 당신이 2

그것에 대해 생각 세션에서 T1에서 삭제하면 insert into t2 values('1','0'); 잠금이 발생하지 않습니다. 이 행을 세션 1에 삽입하면 t2.col1에서 t1.col1까지 참조가 생깁니다. 외부 키는 그 시점에서 유효성이 확인되었으며 오라클은 t1에 '1'이 있음을 알고 있습니다. 세션 2가 t1에서 해당 행을 h 제할 수있는 경우, 세션 2는 t1에 대한 유효하지 않은 참조를 갖는 t2에 커밋되지 않은 행을 갖게되며 이는 의미가 없습니다.

+0

편집했습니다 ... 커밋 진술을 놓쳤습니다. 미안, 그건 내 잘못이야. – KIM

+0

어쨌든, 내 포인트를 얻지 못했습니다 ... 내 포인트는 커밋 된 후에 발생하는 ORA_02292 대신 잠금이 발생하는 이유입니다. – KIM

+0

시도해 보셨습니까? – KIM

관련 문제