oracle-00060,ORA-00060死锁的产生及解决

死锁是数据库经常发生的问题,数据库一般不会无缘无故产生死锁,死锁通常都是由于我们应用程序的设计本身造成的。

会话1:

-- 创建一个测试表,插入两行

18:03:48table tab_dl (id int,name varchar2(30));

Table created.

18:05:50into tab_dl values (1,'DeadLock 1');

1 row created.

18:05:56into tab_dl values (2,'DeadLock 2');

1 row created.

18:06:04;

Commit complete.

-- 分别在不同的会话对这两行进行更新

18:06:06tab_dl set name='DeadLock 3' where id=1;

1 row updated.

会话2:

18:07:14tab_dl set name='DeadLock 4' where id=2;

1 row updated.

会话1:

18:07:37tab_dl set name='DeadLock 5' where id=2;   --此会话在等待,在会话2更新id=1时检测到死锁,自动终止其中一个会话

update tab_dl set name='DeadLock 5' where id=2

*

ERROR at line 1:

ORA-00060: deadlock detected while waiting for resource

会话2:

18:08:00tab_dl set name='DeadLock 6' where id=1;   --此会话一直在等等

-- 以上实验结果得出结论:两个会话同时互相阻塞对方的事务修改时,会产生死锁。

产生死锁时,如何解决呢,下面是常规的解决办法:

会话1:

1)执行下面SQL,先查看哪些表被锁住了:

18:09:22b.owner,b.object_name,a.session_id,a.locked_mode

from v$locked_object a,dba_objects b

where b.object_id = a.object_id;

OWNER                          OBJECT_NAME          SESSION_ID LOCKED_MODE

------------------------------ -------------------- ---------- -----------

SCOTT                          TAB_DL                      144           3

SCOTT                          TAB_DL                       21           3

2)查看引起死锁的会话

18:09:24b.username,b.sid,b.serial#,logon_time

18:09:40   2  from v$locked_object a,v$session b

18:09:40   3  where a.session_id = b.sid order by b.logon_time;

USERNAME                              SID    SERIAL# LOGON_TIME

------------------------------ ---------- ---------- ------------

SCOTT                                  21         53 27-SEP-13

SCOTT                                 144        369 27-SEP-13

3)查看被阻塞的会话

18:11:09* from dba_waiters;

WAITING_SESSION HOLDING_SESSION LOCK_TYPE                  MODE_HELD  MODE_REQUESTED    LOCK_ID1   LOCK_ID2

--------------- --------------- -------------------------- ---------- --------------- ---------- ----------

144              21 Transaction                Exclusive  Exclusive           655372       1186

4)可以提交或回滚阻塞的话,释放锁或者杀掉ORACLE进程:

ALTER SYSTEM KILL SESSION 'SID,SERIAL#';    --对应上例中的21,53

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值