分析死锁的方法

原创 2004年04月07日 21:59:00

常看到死锁的问题,一般都是KILL进程,但如果不查出引起死锁的原因,死锁会时常发生
可以通过查找引起死锁的的操作,就可以方便的解决死锁,现将日常解决问题的方法总结,也许对大家有帮助

1/死锁发生时,通过如下语法,查询出引起死锁的操作

use master
go
declare @spid int,@bl int
DECLARE s_cur CURSOR FOR
select  0 ,blocked
from (select * from sysprocesses where  blocked>0 ) a
where not exists(select * from (select * from sysprocesses where  blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses where  blocked>0
OPEN s_cur
FETCH NEXT FROM s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0
begin
 if @spid =0
            select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'
 else
            select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'
 DBCC INPUTBUFFER (@bl )
 FETCH NEXT FROM s_cur INTO @spid,@bl
end
CLOSE s_cur
DEALLOCATE s_cur

exec sp_who2
2/查找程序/数据库,此t_sql语法在什么地方使用
3/分析找到的,并解决问题

EG:

/*
-------------------------------------------------------
引起数据库死锁的是: 71进程号,其执行的SQL语法如下

EventType      Parameters EventInfo                                       
-------------- ---------- ------------------------------------------------
Language Event 0         
select * from test
insert test values(1,2)


(所影响的行数为 1 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
                                                                              
------------------------------------------------------------------------------
进程号SPID:64被进程号SPID:71阻塞,其当前进程执行的SQL语法如下

EventType      Parameters EventInfo                                       
-------------- ---------- ------------------------------------------------
Language Event 0         
select * from test
insert test values(1,2)


(所影响的行数为 1 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
                                                                              
------------------------------------------------------------------------------
进程号SPID:65被进程号SPID:64阻塞,其当前进程执行的SQL语法如下

EventType      Parameters EventInfo                                                                                         
-------------- ---------- --------------------------------------------------------------------------------------------------
Language Event 0          begin tran
select * from test with (holdlock)
waitfor time '12:00'
select * from test
commit

(所影响的行数为 1 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
                                                                              
------------------------------------------------------------------------------
进程号SPID:73被进程号SPID:64阻塞,其当前进程执行的SQL语法如下

EventType      Parameters EventInfo                                                                                         
-------------- ---------- --------------------------------------------------------------------------------------------------
Language Event 0          begin tran
select * from test with (holdlock)
waitfor time '12:00'
select * from test
commit

(所影响的行数为 1 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/

Linux死锁分析

 1.工具     pstack 进程PID,多次查看线程状态,如果一直处于一样,则锁住了,需进一步分析 谁 拿了锁, 为了方便对应代码分析 ,需要打印出线程的TID 非线程ID, { ...
  • doitsjz
  • doitsjz
  • 2015年11月22日 11:31
  • 361

使用Windbg分析程序死锁小结

死锁场景描述:          针对之前一个版本反馈回来的问题,对数据通讯模块升级,做了精简和重构         因为ABA问题的存在,将之前以Socket为key改为以只增的Int为key。使用...
  • xian_wwq
  • xian_wwq
  • 2014年12月02日 09:04
  • 1619

MySQL死锁分析

1. 测试描述 环境说明:RHEL 6.4 x86_64 + MySQL 5.5.37,事务隔离级别为RC 测试表: mysql> show create table t1\G ***********...
  • HW_LiBo
  • HW_LiBo
  • 2014年08月24日 02:20
  • 10796

Linux 上分析死锁的简单方法--gdb+pstack

简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,...
  • suifengpiao_2011
  • suifengpiao_2011
  • 2017年02月21日 16:41
  • 1478

jstack分析死锁

先附上死锁代码:package test; public class lock {     public static Object lock1=new Object();     public s...
  • huchunlinnk
  • huchunlinnk
  • 2016年01月15日 15:12
  • 1419

java thread dump 分析 死锁

昨天看到有人问:”一个程序在运行的时候,如何知道它是否发生死锁,如果发生死锁,如何找到发生死锁的位置?“;便贴了一段dump线程的数据,今天又有人问我怎么从dump文件中分析死锁,随做此文: 1、首...
  • taoli1986
  • taoli1986
  • 2016年12月08日 20:25
  • 810

【操作系统】处理死锁的方法

破坏死锁的四个必要条件中的一个或几个。预防死锁 破坏互斥条件 破坏请求和保持条件 破坏不可剥夺条件 破坏环路等待条件 破坏互斥条件即允许多个进程同时访问资源。但由于资源本身固有特性的限制,此方法不可行...
  • qq_28602957
  • qq_28602957
  • 2016年12月07日 17:09
  • 2282

死锁实现和怎样分析死锁

分析死锁,我们需要用到"Java thread dump"应用,可以点击超链接查看。避免嵌套死锁:最是引起死锁最常见的原因,如果你已经有锁了避免锁住另一个资源。如果你只工作在一个对象上的锁,这是最不可...
  • paincupid
  • paincupid
  • 2015年08月12日 11:28
  • 2444

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

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

根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。

public void test(int i) { lock(this) { if (i>10) { i--; test(i); } } } 答:不会发生死锁...
  • X_X_OO
  • X_X_OO
  • 2016年09月05日 20:04
  • 1430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分析死锁的方法
举报原因:
原因补充:

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