zoukankan      html  css  js  c++  java
  • Oracle死锁只会回滚跟死锁有关的那条SQL,而不会回滚整个事务

    数据库检测到死锁后,只会回滚跟死锁有关的某条语句,而不会回滚整个事务。
    创建测试环境:
    SQL> create table test1(id int,name char(1));
    表已创建。
    SQL> insert into test1 values(1,'a');
    已创建 1 行。
    SQL> commit;
    提交完成。
    SQL> create table test2 as select * from test1;
    表已创建。
    session1:
    SQL> update test1 set name='b' where id=1;
    已更新 1 行。
    session2:
    SQL> update test2 set name='c' where id=1;
    已更新 1 行。

    再回到session1执行:update test2 set name='d' where id=1;
    这时发现session1被阻塞了(session2正在更新id=1这一行)
    再回到session2执行:update test1 set name='e' where id=1;
    这时session2也被阻塞(session1正在更新id=1这一行)
    但是很快,数据库检测到了session1和session2间存在死锁,随机选中一个会话作为牺牲品,例如本例中将session1选作牺牲品:
    session1:
    SQL> update test2 set name='d' where id=1;
    update test2 set name='d' where id=1
    *
    第 1 行出现错误:
    ORA-00060: 等待资源时检测到死锁
    这时发现session2仍然处于阻塞状态,为何?
    SQL> update test1 set name='e' where id=1;

    我们看下session1中:
    SQL> select * from test1;
            ID N
    ---------- -
    1 b

    看到了吧,其实session1中对test1的修改仍然保留着,也就是说这个sql语句的更新没有回滚,而回滚的只是跟死锁有关的那条sql。 所以,所以,阻塞还在继续......
  • 相关阅读:
    Android studio USB连接失败
    BZOJ 1013 [JSOI2008]球形空间产生器sphere
    UVA1025
    noip2016天天爱跑步
    noip2015运输计划
    noip2012借教室
    BZOJ 1597: [Usaco2008 Mar]土地购买
    BZOJ1010: [HNOI2008]玩具装箱toy
    BZOJ1026: [SCOI2009]windy数
    BZOJ1801:[Ahoi2009]chess 中国象棋
  • 原文地址:https://www.cnblogs.com/zhaoshuangshuang/p/3212580.html
Copyright © 2011-2022 走看看