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

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

      一、       
      数据库死锁的现象
      程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。

      二、       
      死锁的原理
      当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
      交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
      此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。

      三、       
      死锁的定位方法
      通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
      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进程。

关于数据库死锁的检查方法,布布扣,bubuko.com

时间: 2024-08-26 14:01:30

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

数据库死锁的检查和解决方法

转自:数据库死锁的检查方法 数据库死锁的检查方法 一.         数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错.二.         死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错.三.         死锁的定位方法通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台.

SqlServer定时备份数据库和定时杀死数据库死锁解决

PS:Sqlserver 2008 R2,windows 8 64位 1.备份数据库 因为要备份,我们就要用到Sqlserver的代理,默认数据库的代理是不开启的.需要我们手动开启的. 执行备份数据库脚本,现在将脚本公布,其实将这一段代码中需要保存的文件路径和数据库名称替换一下就可以实现备份了.但是还没有达到定时备份的目的 ? 1 2 3 4 5 6 7 8 9 10 11 --自动备份并保存最近5天的SQL数据库作业脚本 宋彪 20130310 DECLARE @filename VARCHA

数据库死锁及解决死锁问题

deadlocks(死锁) 所谓死锁<DeadLock>: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁. 一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源

数据库死锁的解决办法

数据库死锁的解决办法 近日在博客网站上,回复别人的数据库死锁避免问题,之前也曾经几次答复过同样的内容,觉得很有必要汇聚成一个博客文章,方便大家. 这里的办法,对所有的数据库都适用. 这个解决办法步骤如下: 1. 每个表中加 updated_count (integer) 字段 2. 新增一行数据,updated_count =0 :insert into table_x (f1,f2,...,update_count) values(...,0); 3. 根据主键获取一行数据 SQL,封装成一个

MySQL数据库死锁分析

背景说明: 公司内部一套自建分布式交易服务平台,在POC稳定性压力测试的时候出现了数据库死锁.(InnoDB引擎)由于保密性,假设是app_test表死锁了. 现象: 发生异常:Deadlock found when trying to get lock; try restarting transaction 分析思路: 1.回忆和查找相关资料,InnoDB死锁导致的原因. 第一:涉及多表访问,两个事务相互占有对方需要的锁.假设有A表(含有初始化记录1)和B表(含有初始化记录2).进行如下操作会

MySQL数据库mysqlcheck的使用方法

MySQL数据库mysqlcheck的使用方法的相关知识是本文我们主要要介绍的内容,我们知道,mysqlcheck,是mysql自带的可以检查和修复MyISAM表,并且它还可以优化和分析表,mysqlcheck的功能类似myisamchk,但其工作不同. 主要差别是当mysqld服务器在运行时必须使用mysqlcheck,而myisamchk应用于服务器没有运行时. 使用mysqlcheck的好处是不需要停止服务器来检查或修复表. 使用myisamchk修复失败是不可逆的. 1 mysqlche

PHP备份数据库的原理和方法 57

1.PHP备份数据库的原理查找所有表--查找所有字段(需要列出所有字段名, 字段类型等相关信 息)---查找所有数据(读取数据出来注意 特殊符号的转换 addslashes ())--生成SQL(把数据格式化 生成对应的SQL)通过相关函数输出SQL相关信息,并格式化后生成文件,保存!2.PHP中mysql相关函数mysql_list_tables() 表查询函数,类似mysql_query() 函数 mysql_fetch_field() 字段信息函数,返回句柄 Name 字段的名称 Tabl

InnoDB数据库死锁

场景描述 在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found when trying to get lock; try restarting transaction...). 问题分析 这个异常并不会影响用户使用,因为数据库遇到死锁会自动回滚并重试.用户的感觉就是操作稍有卡顿.但是监控老是报异常,所以需要解决一下. 解决方法 在应用程序中update的地方使用try-catch. 我自己封装了一个函数,如下. /** *

C++连接mysql数据库的两种方法

现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多.通过网上的一些资料和自己的摸索,大致清楚了C++连接mysql的方法.可以通过2种方法实现. 第一种方法是利用ADO连接, 第二种方法是利用mysql自己的api函数进行连接. 第一种方法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库.暂时只连接了mysql,sqlserver,oracle,access.对于access,因为它创建表的