`
gaoyuntao2005
  • 浏览: 313163 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于数据库死锁的检查方法

阅读更多

SELECT   bs.username "Blocking User", bs.username "DB User",
         ws.username "Waiting User", bs.SID "SID", ws.SID "WSID",
         bs.serial# "Serial#", bs.sql_address "address",
         bs.sql_hash_value "Sql hash", bs.program "Blocking App",
         ws.program "Waiting App", bs.machine "Blocking Machine",
         ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
         ws.osuser "Waiting OS User", bs.serial# "Serial#",
         ws.serial# "WSerial#",
         DECODE (wk.TYPE,
                 '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',
                 wk.TYPE
                ) lock_type,
         DECODE (hk.lmode,
                 0, 'None',
                 1, 'NULL',
                 2, 'ROW-S (SS)',
                 3, 'ROW-X (SX)',
                 4, 'SHARE',
                 5, 'S/ROW-X (SSX)',
                 6, 'EXCLUSIVE',
                 TO_CHAR (hk.lmode)
                ) mode_held,
         DECODE (wk.request,
                 0, 'None',
                 1, 'NULL',
                 2, 'ROW-S (SS)',
                 3, 'ROW-X (SX)',
                 4, 'SHARE',
                 5, 'S/ROW-X (SSX)',
                 6, 'EXCLUSIVE',
                 TO_CHAR (wk.request)
                ) mode_requested,
         TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
         DECODE
            (hk.BLOCK,
             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 (hk.BLOCK)
            ) blocking_others
    FROM v$lock hk, v$session bs, v$lock wk, v$session ws
   WHERE hk.BLOCK = 1
     AND hk.lmode != 0
     AND hk.lmode != 1
     AND wk.request != 0
     AND wk.TYPE(+) = hk.TYPE
     AND wk.id1(+) = hk.id1
     AND wk.id2(+) = hk.id2
     AND hk.SID = bs.SID(+)
     AND wk.SID = ws.SID(+)
     AND (bs.username IS NOT NULL)
     AND (bs.username <> 'SYSTEM')
     AND (bs.username <> '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)用dba用户执行以下语句
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)
如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
Username:死锁语句所用的数据库用户;
Lockwait:死锁的状态,如果有内容表示被死锁。
Status: 状态,active表示被死锁
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。
2)用dba用户执行以下语句,可以查看到被死锁的语句。
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))

四、        死锁的解决方法
    一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可
能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。
 经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。

  1)查找死锁的进程:

sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;

  2)kill掉这个死锁的进程:

  alter system kill session ‘sid,serial#’; (其中sid=l.session_id)

  3)如果还不能解决:

select pro.spid from v$session ses,
v$process pro where ses.sid=XX and
ses.paddr=pro.addr;

  其中sid用死锁的sid替换:

exit
ps -ef|grep spid

  其中spid是这个进程的进程号,kill掉这个Oracle进程

分享到:
评论

相关推荐

    sql数据库死锁查询工具

    本文将深入探讨“sql数据库死锁查询工具”及其在解决数据库死锁和阻塞过程中的作用。 **1. SQL死锁** SQL死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,它们都将无法...

    数据库死锁-解决死锁问题的三种办法

    总之,解决数据库死锁问题的三种方法各有优缺点,实际应用中应根据具体情况和需求选择最适合的策略。预防死锁虽能有效避免死锁的发生,但可能限制了资源的利用率;检测死锁虽然灵活性较高,但可能会增加系统的复杂性...

    查看数据库死锁信息

    标题所提及的"查看数据库死锁信息"是一个至关重要的任务,因为死锁可能导致数据库性能下降,甚至影响到服务的正常运行。当出现"Deadlock found when trying to get to lock; try restarting transaction"这样的错误...

    数据库阻塞/死锁检查处理方法

    数据库阻塞/死锁检查处理方法 数据库阻塞/死锁检查处理方法是一种用于解决数据库阻塞/死锁问题的方法。该方法通过检查数据库中的等待事件、锁等待情况、会话情况等来判断数据库是否存在阻塞/死锁,并根据不同的原因...

    MYSQL 数据库死锁

    MySQL数据库死锁是数据库系统中常见的问题,它发生在两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。了解和处理死锁是数据库管理员和开发人员必备的技能。...

    数据库死锁检测工具

    数据库死锁是数据库管理系统中常见的问题,特别是在并发环境中。死锁发生时,两个或多个事务在等待对方释放资源,导致所有事务都无法继续执行,系统陷入僵局。为了解决这个问题,"数据库死锁检测工具"应运而生,它...

    数据库死锁分析.doc

    数据库死锁分析是数据库设计、开发和运行维护中非常重要的一个问题,需要严格遵守《数据库设计规范》,使用行锁和控制事务的执行时间,避免死锁的产生,并定期检查数据库日志,自动解开死锁,避免死锁对数据库的影响...

    查询SQL server数据库死锁存储过程

    ### SQL Server 数据库死锁查询存储过程解析 #### 标题与描述理解 标题与描述均指出本篇讨论的主题是“查询SQL Server数据库死锁存储过程”。这表明文章旨在介绍一个用于检测SQL Server环境中发生的死锁现象的...

    解决Sybase数据库死锁

    ### 解决Sybase数据库死锁 #### Sybase数据库死锁概述 死锁是数据库管理系统中一个常见的问题,尤其是在高并发的环境下更为突出。Sybase数据库中的死锁通常发生在两个或多个事务试图锁定相同的资源(如表或记录)时...

    数据库死锁

    ### 数据库死锁详解 #### 一、数据库死锁概念 数据库死锁是数据库系统中一个重要的并发控制问题。在多用户共享数据的环境中,为了保证数据的一致性和准确性,通常会采用锁定机制来实现对数据资源的访问控制。然而...

    DB2解数据库死锁.doc

    解决DB2数据库死锁的问题通常涉及以下几个步骤: 1. **死锁检测**:DB2系统内建了死锁检测机制,会在发现死锁时自动尝试解决。不过,管理员也可以通过监控工具主动检查。`db2top`是一个强大的DB2性能监控工具,通过...

    db2死锁问题分析及解决方案

    在数据库管理与维护过程中,死锁问题是一个常见的挑战,特别是在使用IBM DB2这样的大型关系型数据库管理系统时。本文将详细探讨DB2中死锁问题的分析方法及有效的解决方案,并提供具体的步骤和技术指导。 #### 二、...

    mysql 数据库死锁原因及解决办法

    MySQL数据库死锁是数据库管理系统中常见的一种问题,它发生在两个或更多个事务之间,当它们互相等待对方释放资源,导致所有事务都无法继续执行。死锁的发生通常与资源的竞争和事务的执行顺序有关。 死锁产生的主要...

    数据库死锁adafsdfasdf

    数据库死锁是指在数据库系统中,两个或多个并发进程互相等待对方释放资源,导致所有进程都无法继续执行的状态。这种情况的发生通常源于系统资源不足、进程推进顺序不合适或资源分配不当等因素。 产生死锁的四个必要...

    ORA-00060: 等待资源时检测到死锁--oracle 数据库表死锁异常

    诊断死锁的方法主要包括使用Oracle的DBA视图如V$SESSION_WAIT和V$LOCKED_OBJECT,以及使用DBMS_XTRACE包进行死锁跟踪。在描述中提到的博文链接中,可能包含了通过这些视图分析死锁问题的实例。"表死锁反馈.doc"文件...

    查询Sqlserver数据库死锁的一个存储过程分享

    在SQL Server数据库中,死锁是一个常见的问题,它发生在两个或更多事务相互等待对方释放资源,从而导致所有事务都无法继续执行。死锁的检测和解决是数据库管理员和开发者的重要任务,因为它们可能导致应用程序的性能...

    oracle-死锁查询

    oracle死锁问题查询代码,仅供参考,有问题大家一起交流

    分析SQL Server 数据库中的死锁

    SQL Server提供了多种工具和方法来检测、分析和预防死锁,以确保数据库系统的高效运行。 ### 死锁检测与分析 #### 使用跟踪标志1204 在SQL Server中,启用跟踪标志1204是检测死锁的一个有效方式。当启用此标志后...

    检查Oracle数据库性能情况,包含:检查数据库的等待事件,检查死锁及处理

    根据提供的文件信息,我们可以深入探讨如何检查Oracle数据库的性能情况,包括检查数据库的等待事件、检查和处理死锁等关键方面。以下是对这些知识点的详细解释: ### 1. 检查Oracle数据库状态 #### 1.1. 查看...

Global site tag (gtag.js) - Google Analytics