我们在Oracle 11.2g中遇到了死锁问题。死锁发生的一个潜在原因是从子表中删除时锁定了父表。我查阅了Oracle文档,但没有找到任何关于这种类型锁的规范说明。非常感谢您提供任何解释或文档参考。
以下是代码:
以下是代码:
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表。这里有两个新的锁“table_child”和“table_parent”,类型为“TM”。
以下是查看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”被锁定了?