oracle 死锁现象重现,查询及处理

前端之家收集整理的这篇文章主要介绍了oracle 死锁现象重现,查询及处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。

Oracle 10g,PL/sql version 9.2

  1. CREATETABLEtestLock(
  2. IDNUMBER,
  3. testVARCHAR(100)
  4. )
  5. COMMIT
  6. INSERTINTOtestLockVALUES(1,'test1');
  7. VALUES(2,'test2');
  8. COMMIT;
copy
    SELECT*FROMtestLock
  1. IDTEST
  2. --------------------------------------------
  3. 1test1
  4. 2test2


死锁现象的重现:

1)在sql 窗口 执行:SELECT * FROM testLock FOR UPDATE; -- 加行级锁 并对内容进行修改,不要提交

2)另开一个command窗口,执行:delete from testLock WHERE ID=1;

此时发生死锁(注意此时要另开一个窗口,不然会提示:POST THE CHANGE RECORD TO THE DATABASE. 点yes 后强制commit):

3)死锁查看:

copy
    <p></p><p>
  1. sql>selects.username,l.object_id,l.session_id,s.serial#,s.lockwait,s.status,s.machine,s.programfromv$sessions,v$locked_objectlwheres.sid=l.session_id;</p><p>USERNAMESESSION_IDSERIAL#LOCKWAITSTATUSMACHINEPROGRAM
  2. --------------------------------------------------------------------------------
  3. SYS146104INACTIVEWORKGROUP\J-THINKPLsqlDev.exe
  4. SYS14414520834474ACTIVEWORKGROUP\J-THINKPLsqlDev.exe</p><p></p>

字段说明:
Username:死锁语句所用的数据库用户
SID: session identifier, session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。
SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。
Lockwait:可以通过这个字段查询出当前正在等待的锁的相关信息。
Status:用来判断session状态。Active:正执行sql语句。Inactive:等待操作。Killed:被标注为删除
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。

4)查看引起死锁的语句:

copy
    sql>selectsql_textfromv$sqlwherehash_valuein(selectsql_hash_valuefromv$sessionwheresidselectsession_idfromv$locked_object));
  1. sql_TEXT
  2. ------------------------------------------------------------
copy
    deletefromtestLockwhereID=1


5)死锁的处理:

copy
    altersystemkillsession'144,145';
  1. Systemaltered
  2. Executedin1.061seconds


此时在执行delete语句的窗口出现:

copy
    whereID=1;
  1. whereID=1
  2. ORA-00028:您的会话己被终止


再查看一下死锁,会发现已经没有stauts为active的记录了:

copy
    wheres.sid=l.session_id;
  1. USERNAMESESSION_IDSERIAL#LOCKWAITSTATUSMACHINEPROGRAM
  2. --------------------------------------------------------------------------------------------
copy
    SYS146104INACTIVEWORKGROUP\J-THINKPLsqlDev.exe
  1. in0.032seconds


发生死锁饿语句已经被终止。


引用:

教您如何检查oracle死锁

Oracle死锁的处理

Oracle动态性能表 v$session & v$process

原文链接:https://www.f2er.com/oracle/213576.html

猜你在找的Oracle相关文章