`
guoyiqi
  • 浏览: 1013726 次
社区版块
存档分类
最新评论

sql server死锁原因(转自:http://www.lao8.org/html/8/2009-7-19/2009719133547.html)

 
阅读更多

其实所有的死锁最深层的原因就是一个:资源竞争
  sql server死锁表现一:
   一个用户A 访问表A(锁住了表A),然后又访问表B
   另一个用户B 访问表B(锁住了表B),然后企图访问表A
   这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了
   同样用户B要等用户A释放表A才能继续这就死锁了
  sql server死锁解决方法:
   这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法
   仔细分析你程序的逻辑,
   1:尽量避免同时锁定两个资源
   2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源.
  
  sql server死锁表现二:
   用户A读一条纪录,然后修改该条纪录
   这是用户B修改该条纪录
   这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释
  放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。
   这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。
  sql server死锁解决方法:
   让用户A的事务(即先读后写类型的操作),在select 时就是用Update lock
   语法如下:
   select * from table1 with(updlock) where ....

死锁检查

对于数据库死锁,通常可以通过TRACE FLAG 1204、1205、1206,检查ERRORLOG里面的输出,和分析SQLTRACE的执行上下文判断死锁问题的来由。
TRACEON函数的第三个参数设置为-1,表示不单单针对当前connection,而是针对所有包括未来建立
的connection。这样,才够完全,否则只是监视当前已经建立的数据库连接了。

执行下面的话可以把死锁记录到Errorlog中:

dbcc traceon (1204, 3605, -1)
go
dbcc tracestatus(-1)
go

得到的输出为:

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
TraceFlag Status
--------- ------
1204 1
1205 1
3605 1

(所影响的行数为 3 行)

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

此后,你可以查看数据库的例行日志,每隔一段时间,数据库都会检查死锁,日志文本如下所示:

2004-01-16 18:34:38.50 spid4 ----------------------------------
2004-01-16 18:34:38.50 spid4 Starting deadlock search 1976

2004-01-16 18:34:38.50 spid4 Target Resource Owner:
2004-01-16 18:34:38.50 spid4 ResType:LockOwner Stype:'OR' Mode: U SPID:55 ECID:0 Ec:(0xAA577570) Value:0x4c25cba0
2004-01-16 18:34:38.50 spid4 Node:1 ResType:LockOwner Stype:'OR' Mode: U SPID:55 ECID:0 Ec:(0xAA577570) Value:0x4c25cba0
2004-01-16 18:34:38.50 spid4 Node:2 ResType:LockOwner Stype:'OR' Mode: U SPID:71 ECID:0 Ec:(0xABF07570) Value:0x9bd0ba00
2004-01-16 18:34:38.50 spid4
2004-01-16 18:34:38.50 spid4 -- next branch --
2004-01-16 18:34:38.50 spid4 Node:2 ResType:LockOwner Stype:'OR' Mode: U SPID:71 ECID:0 Ec:(0xABF07570) Value:0x9bd0ba00
2004-01-16 18:34:38.50 spid4
2004-01-16 18:34:38.50 spid4
2004-01-16 18:34:38.50 spid4 End deadlock search 1976 ... a deadlock was not found.
2004-01-16 18:34:38.50 spid4 ----------------------------------

附录:
DBCC TRACEON
打开(启用)指定的跟踪标记。

注释
跟踪标记用于自定义某些控制 Microsoft® SQL Server? 操作方式的特性。跟踪标记在服务器中
一直保持启用状态,直到通过执行 DBCC TRACEOFF 语句对其禁用为止。在发出 DBCC TRACEON
语句之前,连入到服务器的新连接看不到任何跟踪标记。一旦发出该语句,该连接就能看到服务
器中当前启用的所有跟踪标记(即使这些标记是由其它连接启用)。

跟踪标记
跟踪标记用于临时设置服务器的特定特征或关闭特定行为。如果启动 Microsoft® SQL Server
时设置了跟踪标记 3205,将禁用磁带驱动程序的硬件压缩。跟踪标记经常用于诊断性能问题,
或调试存储过程或复杂的计算机系统。

下列跟踪标记在 SQL Server 中可用。

跟踪标记

描述

1204

返回参与死锁的锁的类型以及当前受影响的命令。

实际上可以在“错误 1000 -1999”中找到他们:

1204

19

SQL Server 此时无法获取 LOCK 资源。请在活动用户数较少时重新运行您的语句,或者请求系统管理员检查 SQL Server 锁和内存配置。

1205

13

事务(进程 ID %1!)与另一个进程已被死锁在资源 {%2!} 上,且该事务已被选作死锁牺牲品。请重新运行该事务。

1206

18

事务管理器已取消了分布式事务。


sqlserver死锁检查工具

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_who_lock]
GO


use master
go
create procedure sp_who_lock
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int

create table #tmp_lock_who (
id int identity(1,1),
spid smallint,
bl smallint)

IF @@ERROR<>0 RETURN @@ERROR

insert into #tmp_lock_who(spid,bl) 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

IF @@ERROR<>0 RETURN @@ERROR

-- 找到临时表的记录数
select @intCountProperties = Count(*),@intCounter = 1
from #tmp_lock_who

IF @@ERROR<>0 RETURN @@ERROR

if @intCountProperties=0
select '现在没有阻塞和死锁信息' as message

-- 循环开始
while @intCounter <= @intCountProperties
begin
-- 取第一条记录
select @spid = spid,@bl = bl
from #tmp_lock_who where Id = @intCounter
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 )
end

-- 循环指针下移
set @intCounter = @intCounter + 1
end


drop table #tmp_lock_who

return 0
end

分享到:
评论

相关推荐

    udisks2-qt5-master_2qt5.com_www.2qt5·com_htts://www.2qt5.com_htt

    5. **线程安全**:由于设备操作可能涉及I/O,应用需要确保线程安全以防止数据竞争和死锁。 为了构建和运行这个应用,开发者需要熟悉Qt5的编程,并且需要安装必要的依赖,如udisks2库、Qt开发工具和可能的其他库。在...

    电影网站系统源代码ASP代码 http://www.fytcw.com

    4、用户中心加入用户死锁后自救功能 5、用户中心加入用户自杀功能 6、模板设置下方加入,在线演示 7、解决播放时扣点用户显示级别不够的问题,扣点会员可观看所有影片 8、同一IP注册限制时间 9、生成充值卡时可...

    SQL Server死锁的解除方法

    "SQL Server死锁的解除方法" SQL Server死锁是指在多个事务之间的资源竞争时,出现的循环等待资源的现象。死锁会导致系统性能下降,甚至会导致系统崩溃。因此,解决SQL Server死锁是非常重要的。 SQL Server死锁的...

    《SQL Server 2008查询性能优化》扫描版[PDF] 第一卷

    《SQL Server 2008查询性能优化》(SQL Server 2008 Query Performance Tuning Distilled)扫描版[PDF] 个人感觉不错,对Sqlserver优化很有帮助,主要都是我们经常犯的错,值得借鉴:如:低性能的查询、索引、死锁等等...

    《SQL Server 2008查询性能优化》扫描版[PDF] 第二卷

    《SQL Server 2008查询性能优化》(SQL Server 2008 Query Performance Tuning Distilled)扫描版[PDF] 个人感觉不错,对Sqlserver优化很有帮助,主要都是我们经常犯的错,值得借鉴:如:低性能的查询、索引、死锁等等...

    《SQL Server 2008查询性能优化》扫描版[PDF] 第四卷

    《SQL Server 2008查询性能优化》(SQL Server 2008 Query Performance Tuning Distilled)扫描版[PDF] 个人感觉不错,对Sqlserver优化很有帮助,主要都是我们经常犯的错,值得借鉴:如:低性能的查询、索引、死锁等等...

    《SQL Server 2008查询性能优化》扫描版[PDF] 第三卷

    《SQL Server 2008查询性能优化》(SQL Server 2008 Query Performance Tuning Distilled)扫描版[PDF] 个人感觉不错,对Sqlserver优化很有帮助,主要都是我们经常犯的错,值得借鉴:如:低性能的查询、索引、死锁等等...

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

    SQL Server死锁是数据库系统中常见的问题,它发生在两个或多个事务之间,因为它们相互等待对方释放资源,导致事务无法继续执行。理解死锁的原因和解决策略对于优化数据库性能至关重要。 首先,我们要深入理解死锁的...

    SQL Server死锁总结

    ### SQL Server死锁总结 #### 一、死锁原理 死锁是计算机系统中常见的问题之一,特别是在数据库管理系统中,由于并发控制不当可能导致系统性能下降甚至完全停止响应。在SQL Server中,死锁指的是两个或多个事务...

    sql server 死锁检测

    - **死锁图分析**:通过查看SQL Server生成的死锁图来了解死锁的具体原因,从而优化代码逻辑。 总之,理解并有效处理SQL Server中的死锁问题对于确保系统的稳定性和性能至关重要。通过上述方法可以有效地管理和避免...

    解决了关闭串口时死锁的CSerialPort类

    与2016-12-20日在其基础上修改了其中关串口卡死现象,添加十六进制与ASCII之间互转函数,觉得蛮好用的推荐给大家 如需转载请标明原始出处:http://blog.csdn.NET/itas109 QQ技术交流群:129518033 这是一份优秀的类...

    SQLServler自动杀死死锁进程

    在SQL Server数据库管理系统中,死锁是常见的并发问题,它发生在两个或多个事务相互等待对方释放资源,导致它们都无法继续执行。"SQLServer自动杀死死锁进程"这一话题旨在探讨如何配置SQL Server来自动检测并解决...

    操作系统实验2 银行家算法编程 用QT+C++实现 参考:http://t.csdn.cn/FSrmR

    熟悉银行家算法,加深死锁有关概念的理解。 二、内容: 编制银行家算法通用程序,并检测思考题中所给状态的安全性。 三、要求: (1) 下列状态是否安全?(三个进程共享12个同类资源) 进程 已分配资源数 最大需求数 ...

    通过SQL Server Profiler来监视分析死锁

    在SQL Server数据库管理中,死锁是一个常见的性能问题,它发生在两个或多个事务相互等待对方释放资源时。本文将深入探讨如何使用SQL Server Profiler工具来监视和分析死锁,以便更好地理解和解决这类问题。 首先,...

    浅析SQL SERVER死锁产生的原因及解决.pdf

    在探讨SQL Server数据库中死锁产生的原因及其解决方法之前,首先要了解死锁的基本概念。死锁是指在多线程系统中,两个或多个线程之间形成了循环依赖关系,导致它们都在等待对方释放资源,从而都无法继续执行下去的一...

    SQLServer排查死锁

    ### SQL Server 死锁排查与解决方法 #### 一、SQL Server Profiler 监控数据库死锁 在处理SQL Server数据库中的死锁问题时,一个非常实用的工具就是SQL Server Profiler。它可以帮助我们捕捉到数据库运行过程中的...

    sqlserver死锁处理

    ### SQL Server 死锁处理详解 #### 一、引言 在 SQL Server 数据库系统中,当两个或多个事务在等待对方释放资源时,就会发生死锁现象。死锁不仅会降低系统的整体性能,还可能导致数据处理异常中断,严重影响业务...

    并发编程笔记(httpswww.bilibili.comvideoav84491203p=279).zip

    并发编程的核心原理包括线程、进程、同步与通信、线程安全以及死锁等概念。线程是操作系统调度的基本单位,而进程则是一个独立的资源分配单元。在Java中,我们可以使用`Thread`类或实现`Runnable`接口来创建线程。...

    SQL Server死锁查询

    ### SQL Server死锁查询知识点详解 #### 一、SQL Server中的死锁概念 在SQL Server中,当两个或多个事务互相等待对方释放资源时就会发生死锁。这通常发生在两个或更多的事务请求锁定同一资源的不同部分(如行、页...

Global site tag (gtag.js) - Google Analytics