3

Oracle Database 11g Enterprise Edition リリース 11.2.0.1.0 を使用しています。t1(col1)を参照する外部キーを持つ親テーブルt1とt2があります。私が疑問に思っているのは、なぜロックがあるのですか?私がしたことを確認してください...

セッション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 に答える