什么是死锁
当一个会话A想要获得另一个会话B所持有的资源,但是会话B也想要获得会话A所持有的资源时就会出现死锁.
下面将演示一个死锁的例子:
jy@JINGYONG> insert into test_jy values(1,'First'); 已创建 1 行。 jy@JINGYONG> insert into test_jy values(2,'Second'); 已创建 1 行。 jy@JINGYONG> commit; 提交完成。 jy@JINGYONG> select rowid,num,txt from test_jy; ROWID NUM TXT ------------------ ---------- ---------- AAASNsAAEAAAAIlAAA 1 First AAASNsAAEAAAAIlAAB 2 Second session#1: SQL> update test_jy set txt='session1' where num=1; 1 row updated. session#2: jy@JINGYONG> update test_jy set txt='session2' where num=2; 已更新 1 行。 jy@JINGYONG> update test_jy set txt='session2' where num=1;
现在session#2正等待session#1所持有的TX锁
session#1:
SQL> update test_jy set txt='session1' where num=2;
现在session#1正等待这一行的TX锁,这个锁被session#2所持有,然而session#2也正等待session#1这就形成了死锁,当出现死锁时一个会话会抛出一个ORA-00060错误.
session#2:
* 第 1 行出现错误: ORA-00060: 等待资源时检测到死锁
这时session#1仍然被锁直接到session#2提交或回滚出错的ORA-00060的语句它只会回滚当前的语句而不是整个事务.
诊断信息由ora-00060提供
ora-00060错误通常会将错误信息写入alert.log文件并同时创建一个跟踪文件.跟踪文件会根据创建跟踪文件的进程的类型写入user_dump_dest或background_dump_dest目录中.