没有索引的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删除;