数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
找出和解决系统中的锁

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

 

V$LOCK视图中包含了关于锁的信息

V$LOCKED_OBJECT包含了关于锁的对象的信息

 

举个例子:首先在一个session使用了demo用户登陆,然后执行

update lunar set c1='first lock' where c2=999;

系统显示:

SQL> update lunar set c1='first lock' where c2=999;

 

已更新 1 行。

 

已用时间:  00: 00: 00.00

SQL>

这个session没有提交,然后在另一个session中,使用demo登陆,然后仍然执行:

update lunar set c1='first lock' where c2=999;

这时,这个session就会处于idel的状态,也就是他在等待表lunarc2=999这些行的独占锁;然后再开一个新的session,使用使用demo登陆,然后仍然执行:

update lunar set c1='first lock' where c2=999;

这时,这个session也会处于idel的状态,他也在等待表lunarc2=999这些行的独占锁,如图:

 

 

使用sysdba身份登陆,执行下面的脚本:

 

SQL> SELECT DECODE(request,0,'Holder: ','Waiter: ')|| sid sess, id1, id2, lmode,

  2  request, type

  3     FROM V$LOCK

  4   WHERE (id1, id2, type) IN (SELECT id1, id2, type FROM V$LOCK WHERE request>0)

  5     ORDER BY id1, request

  6  /

 

SESS                     ID1        ID2      LMODE    REQUEST TYPE

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

Holder: 12            393247        473          6          0 TX

Waiter: 8             393247        473          0          6 TX

Waiter: 16            393247        473          0          6 TX

 

SQL>

 

HOLDER表示持有锁的进程,waiter表示等待锁的进程,所以我们需要找出来holder的进程,然后根据holdersid找到session的信息,确定是用户会话(而不是系统会话):

SQL> select sid,serial#,sql_hash_value,username,type,program,schemaname from v$session

  2  where sid = 12

  3  /

 

  SID  SERIAL# SQL_HASH_VALUE USERNAME   TYPE       PROGRAM            SCHEMANAME

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

   12       11              0 DEMO       USER       sqlplus.exe        DEMO

 

SQL>

注意,如果sql_hash_value的值不为0则表示该sql还在运行可以进一步使用 前面7.5节提及的《根据hash value找到sql语句》找到这个sql语句

 

我们可以确认这个锁是被一个模式名(可以近似理解为用户名)为demooracle用户,当然也可以确定该进程的类型为用户进程(而不是系统进程)。接下来,我们就可以杀掉这个sid了。

 

如果想看看该用户锁定的对象,可以使用v$locked_object

SQL> select OBJECT_ID,SESSION_ID,ORACLE_USERNAME,PROCESS,LOCKED_MODE

  2  from v$locked_object;

 

 OBJECT_ID SESSION_ID ORACLE_USERNAME                PROCESS      LOCKED_MODE

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

      7382          8 DEMO                           2516:1812              3

      7382         12 DEMO                           2440:2424              3

      7382         16 DEMO                           2524:2384              3

 

SQL>

 

 

然后使用 alter system kill session 来杀掉这个进程就可以了,例如:

SQL> alter system kill session '12,11';

 

System altered

 

SQL>

 

 

 

 




相关文章

相关软件