帮助你解脱困扰:发现并解除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

相关文章推荐

oracle数据库解决死锁

  • 2012年03月07日 14:39
  • 29KB
  • 下载

oracle数据库表死锁或者存储过程,包无法编辑解决方法

一般数据库中存储过程无法编辑,包无法编辑,导致的原因都是因为表的死锁,解决方法 1.一般情况只部署在一台机器的数据库可以单独杀死实例视图里所锁死的表即可. --查看该实例锁死对象 SELECT ...

开发随笔-Oracle数据库-----死锁

oracle死锁问题一直困扰着我们,下面就教您一个oracle死锁的检查方法,如果您之前遇到过oracle死锁方面的问题,不妨一看……   oracle死锁问题一直困扰着我们,下面就教您一个...

oracle数据库死锁解决方法

一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 二、死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对...

oracle数据库死锁

注意这些查询需要给予权限 grant select on v_$process to sa grant select on v_$locked_object to sa grant select on...

oracle数据库简易故障排查之死锁处理

最近一个朋友说他的数据库好慢,而且一个ctx_ddl.sync_index(‘apps.tname’)的过程执行了一周还没执行完毕,也没有报错。开始的时候我以为是表空间的问题,但是因为没时间只是简单找...

简单说明Oracle数据库中对死锁的查询及解决方法

ORA-00060 deadlock detected1.如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。select username,lockwait,status,machine,p...

oracle数据库锁解除方法之一

1、查看数据库锁,诊断锁的来源及类型: select object_id,session_id,locked_mode from v$locked_object; 或者用以下命令: select...

将oracle数据库表结构导出chm帮助文档

先来个效果图:总体分两步:1、通过powerdesigner将数据库导出html文件。2、使用一个小工具(Easy CHM)将htm转换成chm。下面详细说明:1、得到数据库表设计的pdm数据表结构(...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:帮助你解脱困扰:发现并解除ORACLE数据库死锁
举报原因:
原因补充:

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