• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Oracle外键不加索引引起死锁示例
    --创建一个表,此表作为子表

    create table fk_t as select *from user_objects;

    delete from fk_t where object_id is null;

    commit;

    --创建一个表,此表作为父表

    create table pk_t as select *from user_objects;

    delete from pk_t where object_id is null;

    commit;

    --创建父表的主键

    alter table PK_t add constraintpk_pktable primary key (OBJECT_ID);

    --创建子表的外键

    alter table FK_t addconstraint fk_fktable foreign key (OBJECT_ID) references pk_t (OBJECT_ID);

    --session1:执行一个删除操作,这时候在子表和父表上都加了一个Row-S(SX)锁

    delete from fk_t whereobject_id=100;

    delete from pk_t where object_id=100;

    --session2:执行另一个删除操作,发现这时候第二个删除语句等待

    delete from fk_t whereobject_id=200;

    delete from pk_t whereobject_id=200;

    --回到session1:死锁马上发生

    delete from pk_t whereobject_id=100;

    session2中报错:

    SQL> delete from pk_table where object_id=200;
    delete from pk_table where object_id=200
    *
    第 1 行出现错误:

    ORA-00060: 等待资源时检测到死锁

    当对子表的外键列添加索引后,死锁被消除,因为这时删除父表记录不需要对子表加表级锁。

    --为外键建立索引

    create index ind_pk_object_id on fk_t(object_id) nologging;

    --重复上面的操作session1

    delete from fk_t whereobject_id=100;

    delete from pk_t whereobject_id=100;

    --session2

    delete from fk_t whereobject_id=200;

    delete from pk_t whereobject_id=200;

    --回到session1不会发生死锁

    delete from pk_t whereobject_id=100;
    您可能感兴趣的文章:
    • Oracle 查询死锁并解锁的终极处理方法
    • 讲解Oracle数据库中结束死锁进程的一般方法
    • Oracle数据表中的死锁情况解决方法
    • 简单说明Oracle数据库中对死锁的查询及解决方法
    • oracle 会话 死锁 执行sql 执行job的方法
    • Oracle删除死锁进程的方法
    • Oracle对于死锁的处理方法
    • Oracle 死锁的检测查询及处理
    上一篇:Orcale 数据库客户端PL/SQL 中文乱码的问题解决方法
    下一篇:oracle 日期时间函数使用总结
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Oracle外键不加索引引起死锁示例 Oracle,外键,不加,索引,引起,