造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。
Oracle 10g,PL/SQL version 9.2
[sql]
view plain
copy
- CREATETABLEtestLock(
- IDNUMBER,
- testVARCHAR(100)
- )
- COMMIT
-
- INSERTINTOtestLockVALUES(1,'test1');
- VALUES(2,'test2');
- COMMIT;
copy
SELECT*FROMtestLock
- IDTEST
-
- 1test1
- 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>
- 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
-
- SYS146104INACTIVEWORKGROUPJ-THINKPLSQLDev.exe
- SYS14414520834474ACTIVEWORKGROUPJ-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));
- SQL_TEXT
- ------------------------------------------------------------
copy
deletefromtestLockwhereID=1
5)死锁的处理:
copy
altersystemkillsession'144,145';
- Systemaltered
- Executedin1.061seconds
此时在执行delete语句的窗口出现:
copy
whereID=1;
- whereID=1
- ORA-00028:您的会话己被终止
再查看一下死锁,会发现已经没有stauts为active的记录了:
copy
wheres.sid=l.session_id;
- USERNAMESESSION_IDSERIAL#LOCKWAITSTATUSMACHINEPROGRAM
- --------------------------------------------------------------------------------------------
copy
SYS146104INACTIVEWORKGROUPJ-THINKPLSQLDev.exe
- in0.032seconds
发生死锁饿语句已经被终止。
引用:
教您如何检查oracle死锁
Oracle死锁的处理
Oracle动态性能表 v$session & v$process (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|