1 / 13
文档名称:

Oracle常见死锁发生的原因以及解决方法.docx

格式:docx   大小:359KB   页数:13页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Oracle常见死锁发生的原因以及解决方法.docx

上传人:63229029 2017/5/29 文件大小:359 KB

下载得到文件列表

Oracle常见死锁发生的原因以及解决方法.docx

文档介绍

文档介绍:Oracle 常见死锁发生的原因以及解决方法 Oracle 常见死锁发生的原因以及解决办法一,删除和更新之间引起的死锁造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。 Oracle 10g, PL/SQL version CREATE TABLE testLock( ID NUMBER, test VARCHAR(100) ) COMMIT INSERT INTO testLock VALUES(1,'test1'); INSERT INTO testLock VALUES(2,'test2'); COMMIT; SELECT * FROM testLock 1. ID TEST 2. ---------- ---------------------------------- test1 test2 死锁现象的重现: 1)在 sql 窗口执行: SELECT * FROM testLock FOR UPDATE; -- 加行级锁并对内容进行修改,不要提交 2) mand 窗口,执行: delete from testLock WHERE ID=1; 此时发生死锁(注意此时要另开一个窗口,不然会提示: POST THE CHANGE RECORD TO THE DATABASE. 点 yes mit ): 3) 死锁查看: 1. SQL> select ,, ,#, ,,s. machine, from v$session s,v$locked_object l where = ;</p>< p>USERNAME SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PR OGRAM 2. ---------- ---------- ---------- -------- -------- ---------------------- ------------ 3. SYS 146 104 INACTIVE WORKGROUP\J-THINK PLSQL 4. SYS 144 145 20834474 ACTIVE WORKGROUP\J-THINK PLS 字段说明: Username :死锁语句所用的数据库用户; SID: session identifier , session 标示符, session 是通信双方从开始通信到通信结束期间的一个上下文。 SERIAL#: sid 会重用,但是同一个 sid 被重用时, serial# 会增加,不会重复。 Lockwait :可以通过这个字段查询出当前正在等待的锁的相关信息。 Status :用来判断 session 状态。 Active :正执行 SQL 语句。 Inactive :等待操作。 Killed : 被标注为删除。 Machine : 死锁语句所在的机器。 Program : 产生死锁的语句主要来自哪个应用程序。 4) 查看引起死锁的语句: SQL> select sql_text from v$sql where hash_value in (select sql_hash_value from v$se ssion where sid in (select session_id from v$locked_object)); 1. 2. SQL_TEXT 3. ------------------------------------------------------------ 1. delete from testLock where ID =1 5) 死锁的处理: SQL> alter system kill session '144,145'; 1. 2. System altered 3. 4. Executed in seconds 此时在执行 delete 语句的窗口出现: SQL> delete from testLock where ID = 1; 1. 2. delete from testLock where ID =1 3. 4. ORA-00028: 您的会话己被终止再查看一下死锁,会发现已经没有 stauts 为 active 的记录了: SQL> select , ,#, ,,,