plsql 查询存储过程死锁语句_Oracle常见死锁发生的原因以及解决方法

一,删除和更新之间引起的死锁造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。Oracle 10g, PL/SQL version 9.2CREATETABLEtestLock(IDNUMBER,testVARCHAR(100))COMMITINSERTINTOtestLockVALUES(1,'test1');INS...
摘要由CSDN通过智能技术生成

一,删除和更新之间引起的死锁

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

Oracle 10g, PL/SQL version 9.2

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

ID TEST

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

1 test1

2 test2

死锁现象的重现:

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)死锁查看:

SQL>  select s.username,l.object_id, l.session_id,s.serial#, s.lockwait,s.status,s.machine,s.program from v$session s,v$locked_object l where s.sid = l.session_id;

USERNAME    SESSION_ID  SERIAL#    LOCKWAIT STATUS   MACHINE                 PROGRAM

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

SYS         146         104                 INACTIVE WORKGROUP\J-THINK       PLSQLDev.exe

SYS         144         145        20834474 ACTIVE   WORKGROUP\J-THINK       PLSQLDev.exe

字段说明:

Username:死锁语句所用的数据库用户;

SID: session identifier, session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。

SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。

Lockwait:可以通过这个字段查询出当前正在等待的锁的相关信息。

Status:用来判断session状态。Active:正执行SQL语句。Inactive:等待操作。Killed:被标注为删除。

Machine: 死锁语句所在的机器。

Program: 产生死锁的语句主要来自哪个应用程序。

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

SQL>  select sql_text fro

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值