帮助你解脱困扰:发现并解除ORACLE数据库死锁

原创 2006年05月27日 14:38:00

        尽管Oracle的锁定机制已经够完善,但还是有很多人在数据库编程时陷入死锁之中。不要怨天尤人,仔细回顾一下你的设计模型和操作逻辑,问题就在自己身上。

下面程序可以帮助你解除死锁,以解燃眉之急。死锁发生原因在后续文章中会详细讨论。

 

@echo off
echo Author: Gmtsao      Date: 2004-10-19 17:08
echo **********************************************************
echo ****     ***  ***  **  ***  **  ***  **      **     ******
echo ****  **  **  ***  **   **  **   **  **  ******  **  *****
echo ****  **  **  ***  **    *  **    *  **  ******  **  *****
echo ****      **  ***  **       **       **      **      *****
echo ****  *  ***  ***  **  *    **  *    **  ******  *  ******
echo ****  **  **  ***  **  **   **  **   **  ******  **  *****
echo ****  ***  **     ***  ***  **  ***  **      **  ***  ****
echo **********************************************************
echo 用法:将全部文本另存为ccs.bat文件 执行 ccs.bat uid/pwd@servname 即可
echo ORACLE数据库解锁...


set args=""

if "%1"=="" goto end
set args=%1

:loop
shift
if "%1"=="" goto end
   set args=%args% %1
   goto loop

:end

if %args%=="" goto cancel

del /q c:/ckutl.cc

echo CREATE OR REPLACE PROCEDURE SYS.PRC_KILL_LOCKED(P1 NUMBER DEFAULT 0, P2 NUMBER DEFAULT 0) AS>> c:/ckutl.cc
echo   V_SID NUMBER;>> c:/ckutl.cc
echo   V_SERIAL NUMBER;>> c:/ckutl.cc
echo   V_SQL VARCHAR2(4000);>> c:/ckutl.cc
echo   TYPE CUROBJ IS REF CURSOR;>> c:/ckutl.cc
echo   CCOBJ CUROBJ;>> c:/ckutl.cc
echo -->> c:/ckutl.cc
echo BEGIN>> c:/ckutl.cc
echo   IF P1 IS NOT NULL AND P2 IS NOT NULL AND P1 != 0 AND P2 != 0 THEN>> c:/ckutl.cc
echo     V_SQL := CONCAT('ALTER SYSTEM KILL SESSION ''', P1);>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, ', ');>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, P2);>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, '''');>> c:/ckutl.cc
echo     EXECUTE IMMEDIATE V_SQL;>> c:/ckutl.cc
echo     RETURN;>> c:/ckutl.cc
echo   END IF;>> c:/ckutl.cc
echo   -->> c:/ckutl.cc
echo   V_SQL := 'SELECT SID,SERIAL# FROM V$SESSION WHERE SID IN (SELECT SID FROM V$LOCK)';>> c:/ckutl.cc
echo   /*>> c:/ckutl.cc
echo   V_SQL := 'select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ a.sid, a.serial#';>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' from v$session a, v$lock b, v$sqltext c');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' where a.username is not null and a.lockwait = b.kaddr and c.hash_value =a.sql_hash_value');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' union');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ a.sid, a.serial#');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' from v$session a, v$lock b, v$sqltext c');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' where b.id1 in (');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, '   select /*+ NO_MERGE(d) NO_MERGE(e) */ distinct e.id1');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, '   from v$session d, v$lock e');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, '   where d.lockwait = e.kaddr');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' ) and a.username is not null and a.sid = b.sid and b.request=0 and c.hash_value =a.sql_hash_value');>> c:/ckutl.cc
echo   */>> c:/ckutl.cc
echo   -->> c:/ckutl.cc
echo   OPEN CCOBJ FOR V_SQL;>> c:/ckutl.cc
echo   -->> c:/ckutl.cc
echo   LOOP>> c:/ckutl.cc
echo     FETCH CCOBJ INTO V_SID, V_SERIAL;>> c:/ckutl.cc
echo     EXIT WHEN CCOBJ%%NOTFOUND;>> c:/ckutl.cc
echo     V_SQL := CONCAT('ALTER SYSTEM KILL SESSION ''', V_SID);>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, ', ');>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, V_SERIAL);>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, '''');>> c:/ckutl.cc
echo     EXECUTE IMMEDIATE V_SQL;>> c:/ckutl.cc
echo   END LOOP;>> c:/ckutl.cc
echo   CLOSE CCOBJ;>> c:/ckutl.cc
echo EXCEPTION>> c:/ckutl.cc
echo   WHEN OTHERS THEN>> c:/ckutl.cc
echo     NULL;>> c:/ckutl.cc
echo END;>> c:/ckutl.cc
echo />> c:/ckutl.cc
echo EXEC SYS.PRC_KILL_LOCKED>> c:/ckutl.cc
echo />> c:/ckutl.cc
echo DROP PROCEDURE SYS.PRC_KILL_LOCKED>> c:/ckutl.cc
echo />> c:/ckutl.cc
echo QUIT>> c:/ckutl.cc
echo />> c:/ckutl.cc

sqlplus %args% @c:/ckutl.cc

del /q c:/ckutl.cc

@echo on
exit

:cancel

死锁的产生与解除

死锁不仅会发生多个进程中,也会发生在一个进程中。 死锁的概念: 如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么改组进程是死锁的。 死锁的常见表现: (1)多进程...
  • hanjing_1995
  • hanjing_1995
  • 2016年07月18日 18:32
  • 794

27 《给人好印象的秘诀:如何让别人信任你、喜欢你、帮助你》 -豆瓣评分6.6

与您一起终身学习~ 给人好印象的秘诀【 人们在互相观察的时候,为了让自己更“省力”,总会不自觉使用各种偏见和假设。】      在人际交往当中,一个良好的印象非常重要,不仅关系到能否赢得爱情、升职加薪...
  • czg13548930186
  • czg13548930186
  • 2017年06月20日 12:03
  • 680

操作系统(十三)------死锁的检测与解除

下面我们来介绍解决死锁问题的第三类方法 死锁检测与解除 所谓死锁检测呢,是指允许死锁发生 但是操作系统呢 会不断地来监视系统的进展情况 通过监视,判断 死锁是否真的发生了 那么一旦发现有死锁发生 就会...
  • li12412414
  • li12412414
  • 2017年05月08日 22:44
  • 269

死锁的产生原因和解除

死锁的定义 如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的时间,那么该组进程是死锁的。 产生死锁的必要条件 互斥条件:简单的说就是进程抢夺的资源必须是临界资源,一段时间内,...
  • LeetCode8023
  • LeetCode8023
  • 2016年07月29日 15:38
  • 1517

什么是死锁和如何解决死锁

概述死锁的特征和解决方法
  • DT_Zhangshuo
  • DT_Zhangshuo
  • 2016年11月27日 21:14
  • 2147

SQL Server死锁的解除方法

SQL Server死锁使我们经常遇到的问题,下面就为您介绍如何查询死锁,希望对您学习SQL Server死锁方面能有所帮助。 SQL Server死锁的查询方法: exec master.d...
  • tangkechu
  • tangkechu
  • 2013年12月04日 17:24
  • 2053

ACM 网址和一些建议

USACO http://ace.delos.com/usacogate 美国著名在线题库,专门为信息学竞赛选手准备 TJU http://acm.tongji.edu.cn/ 同济大学...
  • u010229420
  • u010229420
  • 2013年07月31日 21:26
  • 2561

死锁的定义、产生原因、必要条件、避免死锁和解除死锁的方法

1.死锁:如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的。 2.产生死锁的原因: (1)竞争不可抢占性资源。 (2)竞争可消耗资源。     当系统中供...
  • yanxiaolx
  • yanxiaolx
  • 2016年07月18日 17:50
  • 3060

死锁产生的原因和必要条件及预防死锁的方法及死锁的检测与解除

产生死锁的原因和必要条件: 产生死锁的原因: 1.竞争资源。当系统中供多个进程共享的资源如打印机,公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。 2.进程推...
  • wangiijing
  • wangiijing
  • 2016年07月17日 00:01
  • 4395

什么是死锁,简述死锁发生的四个必要条件,如何避免死锁,解除死锁

1.死锁:如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的。2.产生死锁的原因:(1)竞争不可抢占性资源。(2)竞争可消耗资源。当系统中供多个进程共享的资...
  • yishouwangnian
  • yishouwangnian
  • 2016年09月30日 09:05
  • 3896
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:帮助你解脱困扰:发现并解除ORACLE数据库死锁
举报原因:
原因补充:

(最多只允许输入30个字)