oracle,存储过程报错,实现杀掉死锁进程,求大牛

oracle,存储过程报错,实现杀掉死锁进程,求大牛,第1张

估计你SQL 拼接错了吧,建议打印一下;

我的测试过程;

--新建一个会话窗口,挂起一个会话;

SQL> create table test(col varchar2(20));

Table created

SQL> insert into test values('test');

1 row inserted 

--再新建一个会话窗口,杀掉锁定test表的会话

SQL> declare

  2  begin

  3    for vref in (select tsid, tserial#

  4                   from v$session t

  5                  where sid in

  6                        (select sid

  7                           from v$lock

  8                          where id1 in

  9                                (select object_id

 10                                   from user_objects t

 11                                  where object_name = upper('test')))) loop

 12      execute immediate 'alter system kill session  ''' || vrefsid || ',' ||

 13                        vrefserial# || '''';

 14    end loop;

 15  end;

 16  /

PL/SQL procedure successfully completed

SQL> 

SQL> select tsid, tserial#

  2                   from v$session t

  3                  where sid in

  4                        (select sid

  5                           from v$lock

  6                          where id1 in

  7                                (select object_id

  8                                   from user_objects t

  9                                  where object_name = upper('test')))

 10  /

       SID    SERIAL#

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

SQL>

下面查询可以查到死锁,但是注意其实查询到的不是真正的死锁,查询到的只是是死锁发生前的等待条件,真正的死锁在10G中会被系统所阻止掉

select t2username||' '||t2sid||' '||t2serial#||' '||t2logon_time||' '||t3sql_text

from v$locked_object t1,v$session t2,v$sqltext t3

where t1session_id=t2sid

and t2sql_address=t3address

order by t2logon_time ;

此外,从V$LOCK的BLOCK字段可以看到,BLOCK>0表示有等待发生了,注意是行级等待,而在表级没有死锁或等待

select from v$lock where block>0 ;

标准的答案!下面3个语句是我经常使用来解决oracle锁问题的--注意你的用户有没有权限问题

1查看被锁的表

SELECTpspid,aserial#,cobject_name,bsession_id,boracle_username,

bos_user_name

FROMv$processp,v$sessiona,v$locked_objectb,all_objectsc

WHEREpaddr=apaddrANDaprocess=bprocess

ANDcobject_id=bobject_id

2查看是哪个进程锁的

SELECTsid,serial#,username,osuserFROMv$sessionwhereosuser='tangpj'

3杀掉这个进程altersystemkillsession'sid,serial#';

Oracle 死锁的检测查询及处理

-- 死锁查询语句

SELECT bsusername "Blocking User", bsusername "DB User",

wsusername "Waiting User", bsSID "SID", wsSID "WSID",

bsserial# "Serial#", bssql_address "address",

bssql_hash_value "Sql hash", bsprogram "Blocking App",

wsprogram "Waiting App", bsmachine "Blocking Machine",

wsmachine "Waiting Machine", bsosuser "Blocking OS User",

wsosuser "Waiting OS User", bsserial# "Serial#",

wsserial# "WSerial#",

DECODE (wkTYPE,

'MR', 'Media Recovery',

'RT', 'Redo Thread',

'UN', 'USER Name',

'TX', 'Transaction',

'TM', 'DML',

'UL', 'PL/SQL USER LOCK',

'DX', 'Distributed Xaction',

'CF', 'Control FILE',

'IS', 'Instance State',

'FS', 'FILE SET',

'IR', 'Instance Recovery',

'ST', 'Disk SPACE Transaction',

'TS', 'Temp Segment',

'IV', 'Library Cache Invalidation',

'LS', 'LOG START OR Switch',

'RW', 'ROW Wait',

'SQ', 'Sequence Number',

'TE', 'Extend TABLE',

'TT', 'Temp TABLE',

wkTYPE

) lock_type,

DECODE (hklmode,

0, 'None',

1, 'NULL',

2, 'ROW-S (SS)',

3, 'ROW-X (SX)',

4, 'SHARE',

5, 'S/ROW-X (SSX)',

6, 'EXCLUSIVE',

TO_CHAR (hklmode)

) mode_held,

DECODE (wkrequest,

0, 'None',

1, 'NULL',

2, 'ROW-S (SS)',

3, 'ROW-X (SX)',

4, 'SHARE',

5, 'S/ROW-X (SSX)',

6, 'EXCLUSIVE',

TO_CHAR (wkrequest)

) mode_requested,

TO_CHAR (hkid1) lock_id1, TO_CHAR (hkid2) lock_id2,

DECODE

(hkBLOCK,

0, 'NOT Blocking', /// Not blocking any other processes /

1, 'Blocking', /// This lock blocks other processes /

2, 'Global', /// This lock is global, so we can't tell /

TO_CHAR (hkBLOCK)

) blocking_others

FROM v$lock hk, v$session bs, v$lock wk, v$session ws

WHERE hkBLOCK = 1

AND hklmode != 0

AND hklmode != 1

AND wkrequest != 0

AND wkTYPE(+) = hkTYPE

AND wkid1(+) = hkid1

AND wkid2(+) = hkid2

AND hkSID = bsSID(+)

AND wkSID = wsSID(+)

AND (bsusername IS NOT NULL)

AND (bsusername <> 'SYSTEM')

AND (bsusername <> 'SYS')

ORDER BY 1;

查询发生死锁的select语句

select sql_text from v$sql where hash_value in (

select sql_hash_value from v$session where sid in (select session_id from v$locked_object)

)

1、可以检查一下数据库中的锁,查看是否有未释放的锁,如果有,可以使用alter system kill session命令来强制释放锁;

2、可以检查一下应用程序的代码,看是否存在没有正确关闭数据库连接的情况;

3、可以检查一下应用程序的代码,看是否存在没有正确提交事务的情况;

4、可以检查一下应用程序的代码,看是否存在没有正确释放资源的情况;

5、可以检查一下应用程序的代码,看是否存在没有正确处理异常的情况;

6、可以检查一下应用程序的代码,看是否存在没有正确处理事务的情况;

7、可以检查一下应用程序的代码,看是否存在没有正确处理数据库连接的情况;

8、可以检查一下应用程序的代码,看是否存在没有正确处理数据库事务的情况;

9、可以检查一下应用程序的代码,看是否存在没有正确处理数据库资源的情况;

10、可以检查一下应用程序的代码,看是否存在没有正确处理数据库连接池的情况;

以上就是关于oracle,存储过程报错,实现杀掉死锁进程,求大牛全部的内容,包括:oracle,存储过程报错,实现杀掉死锁进程,求大牛、如何查询oracle的死锁、咨询一个问题:oracle产生了死锁,很多表被锁住了,如何查找引起死锁的源头进程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9806351.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存