3

我有 Oracle Database 11g Enterprise Edition Release 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

谁能解释我为什么会这样?

4

2 回答 2

3

delete from t1;尝试锁定子表 T2。如果会话正在等待整个表锁定,它甚至不能尝试删除任何内容。

发生这种异常锁定行为是因为您有一个未编制索引的外键

如果你创建一个索引,create index t2_idx on t2(col1);你会得到ORA-02292错误而不是锁。

于 2012-11-15T05:08:21.080 回答
0

锁定来自您的线路:insert into t2 values('1','0');当您在会话 2 中从 t1 删除时,锁定不会发生。

想想看。在会话 1 中插入此行后,就会有从 t2.col1 到 t1.col1 的引用。此时外键已被验证,Oracle 知道 '1' 存在于 t1 中。如果会话 2 可以从 t1 中删除该行,那么会话 2 将在 t2 中有一个未提交的行,该行具有对 t1 的无效引用,这没有任何意义。

于 2012-11-15T01:33:51.347 回答