没有索引的Oracle外部密钥导致死锁

-创建一个表,这是一个数据库

创建表fk_t为SELECT * FROM user_objects;

从fk_t哪里object_id是零删除;

承诺;

-创建一个表,它是父表

创建表pk_t为SELECT * FROM user_objects;

从pk_t哪里object_id是零删除;

承诺;

-创建父表的主键

修改表pk_t添加constraintpk_pktable主键(object_id);

创建的子表的外键

修改表fk_t addconstraint fk_fktable外键(object_id)参考pk_t(object_id);

——最执行删除操作,当一个row-s(SX)锁被添加到子表和父表

从fk_t whereobject_id = 100删除;

Delete from pk_t where object_id=100;

——session2:执行另一个删除操作,发现二删除语句在这个时间等

从fk_t whereobject_id = 200删除;

从pk_t whereobject_id = 200删除;

回到最僵局

从pk_t whereobject_id = 100删除;

session2报告错误的方式:

SQL >删除pk_table哪里object_id = 200;
删除从pk_table哪里object_id = 200
*
第一行错了:

ora-00060:检测到死锁等资源

将索引添加到子表的外键列时,死锁将被消除,因为父表记录的删除不需要对子表进行表级锁定。

-设置外键索引

创建fk_t指数ind_pk_object_id(object_id)nologging;

重复以上操作最

从fk_t whereobject_id = 100删除;

从pk_t whereobject_id = 100删除;

——session2

从fk_t whereobject_id = 200删除;

从pk_t whereobject_id = 200删除;

回到最,不会有死锁

从pk_t whereobject_id = 100删除;