Oracle 11.2g にデッドロックの問題があります。デッドロックが発生する潜在的な理由の 1 つは、子テーブル ロックの親テーブルからの削除です。オラクルのドキュメントから検索しましたが、この種のロックの仕様は見つかりませんでした。ドキュメントの説明や参照は大歓迎です。
これがコードです。
CREATE TABLE table_parent (a NUMBER PRIMARY KEY);
CREATE TABLE table_child (b NUMBER, a NUMBER,PRIMARY KEY (b), CONSTRAINT fk_relation FOREIGN KEY (a) REFERENCES table_parent(a));
INSERT INTO table_parent VALUES (1);
INSERT INTO table_parent VALUES (2);
INSERT INTO table_child VALUES (1,1);
INSERT INTO table_child VALUES (2,1);
INSERT INTO table_child VALUES (3,1);
INSERT INTO table_child VALUES (4,1);
COMMIT;
次に、子テーブルから 1 レコードを削除します。
DELETE FROM table_child WHERE b=4;
コミットを実行する前に V$LOCK テーブルを調べます。「TM」のタイプに「table_child」と「table_parent」という 2 つの新しいロックがあります。
V$LOCK テーブルを検索するクエリは次のとおりです。
SELECT O.OWNER, O.OBJECT_ID, O.OBJECT_NAME, O.OBJECT_TYPE, L.TYPE
FROM DBA_OBJECTS O, V$LOCK L
WHERE O.OBJECT_ID = L.ID1;
問題は、「table_parent」がロックされている理由です。