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语句。