关于SQL server2005+SP3的死锁的一次诊断过程

原创 2011年01月16日 22:45:00

关于SQL server2005+SP3 的死锁的一次诊断过程

 

puberSQLServer 版发了一个帖子SQL server2005+Sp3的死锁问题 ,因最近正在研究SQLServer 的一些问题,出于兴趣决定试试看能不能帮助这位pubber

问题描述

我的程序为多线程,同时最多20 个线程。

20 个线程同时向一个表中做insert 操作,但是各线程之间的记录不可能重复(主键肯定不一样),但是还是报死锁,同样的程序连oracle 运行时却很正常。

各高人给指出个明路啊。

问题分析:

因为只有这些简单的介绍,很难去定位和诊断问题所在,所以我一开始 建议启用他 1204 1222 跟踪标志,通过日志把死锁描述信息详细列出来;或者用 SQL Server Profiler 的定制事件跟踪。

他回复 SQL Server Profiler 的定制事件跟踪 Deadlock graph 得到一个关于健锁的描述

以下为死锁图:


以下为 SQLServer 日志信息:

下面是日志查看器中的信息,应该对应 已用日志 1160 和已用日志 1084 吧。
----------------------------------------------------------------------------
  
日期                 2011-1-14 11:15:11
日志                 SQL Server ( 当前 - 2011-1-14 11:15:00)
                spid21s
消息
process id=processb793d8 taskpriority=0 logused=1084 waitresource=KEY: 9:72057594058113024 (c601cdd76f20) waittime=4984 ownerId=944254 transactionname=INSERT lasttranstarted=2011-01-14T11:15:06.500 XDES=0x8ee8a88 lockMode=S schedulerid=2 kpid=7384 status=suspended spid=69 sbid=0 ecid=0 priority=0 transcount=1 lastbatchstarted=2011-01-14T11:15:06.500 lastbatchcompleted=2011-01-14T11:15:06.497 clientapp=jTDS hostname=WIN7-PC hostpid=123 loginname=ipcc isolationlevel=read committed (2) xactid=944254 currentdb=9 lockTimeout=4294967295 clientoption1=671219744 clientoption2=128056
-----------------------------------------------------------------------------------
日期                 2011-1-14 11:15:11
日志                 SQL Server ( 当前 - 2011-1-14 11:15:00)
                spid21s
消息
process id=processaea988 taskpriority=0 logused=1160 waitresource=KEY: 9:72057594058113024 (3002597d4e10) waittime=4984 ownerId=944255 transactionname=INSERT lasttranstarted=2011-01-14T11:15:06.500 XDES=0x7e3ea88 lockMode=S schedulerid=1 kpid=4208 status=suspended spid=79 sbid=0 ecid=0 priority=0 transcount=1 lastbatchstarted=2011-01-14T11:15:06.500 lastbatchcompleted=2011-01-14T11:15:06.497 clientapp=jTDS hostname=WIN7-PC hostpid=123 loginname=ipcc isolationlevel=read committed (2) xactid=944255 currentdb=9 lockTimeout=4294967295 clientoption1=671219744 clientoption2=128056

初步分析了一下以上日志和图形:

表面提示是一个共享锁和排他锁相互冲突了,即读写和写读冲突

session1     session2

共享锁

                  排它锁

排它锁

                  共享锁

       经过询问和分析,的确是发生在主键上,我怀疑是触发器问题,触发器中执行时间过长, 或者在程序中进行主键生成的过程中,又重复从该表中进行读取。所以想进一步了解表结构、触发器脚本和主键生成的脚本。

问题解决:

       经过几轮折腾,终于他 找到了问题所在,“原来是其他人在这个表中建立了触发器,我不知道,并且这个触发器还访问了这个表。”,去掉触发器,问题消失。

       死锁常见的场景是读写写读冲突,循环引用会造成相互资源的排斥,同时资源得不到释放,建议解决方式,是缩短事务处理时间,减少循环引用等等方法。

一次mysql死锁的排查过程

一、背景    在测试环境测试给用户并发发送卡券时,出现了死锁,但看代码没有死锁,问题如下图    看日志确实发生了死锁,按照死锁产生的原因:一般死锁是两把锁两个人争抢,每个人都获得其...
  • liangtao8702
  • liangtao8702
  • 2016年11月22日 11:14
  • 557

MYSQL死锁诊断方法

本文思路如下: 1、创建一个student表,插入初始数据; 2、制造死锁; 3、查看show engine innodb status发现死锁SQL; 4、查看binlog发现成功事务执行了...
  • DBABruce
  • DBABruce
  • 2016年03月01日 17:44
  • 1878

SQL Server死锁产生原因及解决办法

SQL Server死锁产生原因及解决办法 其实所有的死锁最深层的原因就是一个:资源竞争 表现一:   一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B...
  • ddsheng1128
  • ddsheng1128
  • 2014年09月27日 10:54
  • 2437

Sql语句 循环调用存储过程 设置1秒执行一次!

一个日结的存储过程P_Wms_StockDailyState 参数是格式是'yyyy-MM-dd' 这个存储过程必须一天结算一次!比如在每天的几点几时几分执行这个存储过程! 现在呢 想把之前的...
  • jindou910101
  • jindou910101
  • 2013年06月08日 09:58
  • 1302

数据库死锁解决方案

一、活锁 如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁...
  • zkn_CS_DN_2013
  • zkn_CS_DN_2013
  • 2015年11月19日 15:49
  • 951

检测发生死锁的sql语句

--检测死锁 --如果发生死锁了,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程? --这时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。SQL Server自...
  • shixiaoguo90
  • shixiaoguo90
  • 2014年11月26日 13:39
  • 452

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

所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程...
  • big_bigwolf
  • big_bigwolf
  • 2015年11月14日 10:04
  • 1115

SQL Server死锁的解除方法

SQL Server死锁使我们经常遇到的问题,下面就为您介绍如何查询死锁,希望对您学习SQL Server死锁方面能有所帮助。 SQL Server死锁的查询方法: exec master.d...
  • tangkechu
  • tangkechu
  • 2013年12月04日 17:24
  • 2035

SQL Server中死锁的查询和处理

前些天在同步数据的时候遇到了死锁,今天就结合一个简单的demo讲解一下死锁的产生、查询和处理方法。         首先,我们先来了解一下什么是死锁?死锁的本质是一种僵持状态,是多个主体对于资源的争...
  • u010773667
  • u010773667
  • 2015年09月20日 17:55
  • 1111

SqlServer 并发事务:死锁跟踪(三)6种跟踪死锁的方法总结

方法一:打开profiler跟踪事件 locks: deadlock graph 方法二:打开1222或者1204标志记录死锁,在sqlserver日志查看 DBCC TRACEON...
  • kk185800961
  • kk185800961
  • 2015年01月07日 22:51
  • 8182
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于SQL server2005+SP3的死锁的一次诊断过程
举报原因:
原因补充:

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