Oracle死锁只会回滚跟死锁有关的那条SQL,而不会回滚整个事务

时间:2021-12-30 02:34:55
数据库检测到死锁后,只会回滚跟死锁有关的某条语句,而不会回滚整个事务。
创建测试环境:
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。 所以,所以,阻塞还在继续......