2012-11-15 15 views
3

我有Oracle數據庫11g企業版版本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

鎖從您的線路來:當您從T1在會話2

想想刪除insert into t2 values('1','0');鎖不會發生。一旦在會話1中插入此行,就會從t2.col1返回到t1.col1。外鍵已經在那一點被驗證,Oracle知道'1'存在於t1中。如果會話2可以從t1中刪除該行,那麼會話2在t2中會有一個未提交的行,對t1有一個無效的引用,這沒有任何意義。

+0

我編輯了它...提交語句被錯過了。對不起,這是我的錯。 – KIM

+0

無論如何,你沒有得到我的觀點......我的觀點是爲什麼鎖定發生,而不是ORA_02292發生後提交.... – KIM

+0

你甚至嘗試過嗎? – KIM

相關問題