数码资讯
没有索引的Oracle外部密钥导致死锁
-创建一个表,这是一个数据库 创建表fk_t为SELECT * FROM user_objects; 从fk_t哪里object_id是零删除; 承诺; -创建一个表,它是父表 创建表pk_t为SELECT * FROM user_objects; 从pk_t哪里object_id是零删除; 承诺;
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
-创建一个表,这是一个数据库
创建表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删除;
创建表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删除;
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。