Dead lock

死锁是由于两个或多个session互相等待而造成的,死锁不需要DBA干预,ORACLE会舍弃第一个SESSION中等待的SQL。当用户接收到ORA-00060 死锁警告的时候,用户要么选择rollback,要么选择commit。如果选择rollback,会回滚所有的事物,如果选择commit,这个时候不会commit整个事物,而只会commit被ORACLE舍弃的SQL语句之前的SQL.

测试表以及测试数据如下:

SQL> select * from test;
        ID NAME
---------- ----------
         6 bingbing
         2 robinson
         2 tttt
         3 david
         4 jack
         5 lucy
         1 test
已选择7行。
session 1中:
SQL> update test set name='luoluo' where id=6;
已更新 1 行。
session 2中:
SQL> update test set name='luobingsen' where id=1;
已更新 1 行。
session 1中
SQL> update test set name='lbs' where id=1;//当发生死锁了,ORACLE会将这句话舍弃,注意不是rollback整个事物
这个时候 session1等待 session2 提交,因为session2中id=1的行有一个行排它锁
session 2中
SQL> update test set name='sensen' where id=6;
这个时候 session2等待 session1 提交,因为session1中id=6的行有一个行排它锁
session 1中
SQL> update test set name='lbs' where id=1;
update test set name='lbs' where id=1
       *
第 1 行出现错误:
ORA-00060: 等待资源时检测到死锁
SQL> commit;
提交完成。
SQL> select * from test;
        ID NAME
---------- ----------
         6 luoluo
         2 robinson
         2 tttt
         3 david
         4 jack
         5 lucy
         1 test   //这里test没有变成lbs,因为那条SQL 被ORACLES舍弃了

已选择7行。

可以看到当ORACLE检测到死锁的时候,会舍弃第一个session中等待的那条SQL语句。

原文地址:https://www.cnblogs.com/hehe520/p/6330711.html