牛人笔记----(死锁问题定位与解决方法)

 1 --死锁问题定位与解决方法
  2
  3 --为了解决死锁问题,SQLSERVER数据库引擎死锁监视器会定期检查陷入死锁的任务
  4 --如果监视器检测到这种依赖循环关系,会选择其中一个任务作为牺牲品,然后
  5 --终止其事务并提示错误。这就是用户会遇到的死锁错误
  6
  7 --可以发生死锁的资源
  8 --需要说明的是,死锁不是只发生在锁资源上,以下类型的资源都可能会造成阻塞,并
  9 --最终导致死锁
 10
 11 --1、锁:例如:页,行,元数据和应用程序上的锁
 12 --2、工作线程:如果排队等待线程的任务拥有阻塞其他工作线程的资源,也会导致死锁
 13 --例如:会话1Session1启动事务并获取行1ROW1的共享锁(S锁)后,进入睡眠状态。
 14 --在所有可用工作线程上运行的活动会话正尝试获取行ROW1的排他锁(X锁)。
 15 --当会话Session1苏醒后,因为无法获取工作线程,所以无法提交事务并释放
 16 --行ROW1的锁,导致死锁
 17
 18 --3、内存:当并发请求等待获得内存,而当前的可用内存无法满足其需要时,可能
 19 --发生死锁。例如:两个并发查询(Q1和Q2)作为用户定义函数执行,分别获取
 20 --10MB和20MB内存。如果每个查询需要30MB而可用总内存为20MB,则Q1和Q2必须
 21 --等待对方释放内存,导致死锁
 22
 23 --4、并行查询执行的相关资源:当一条语句用多个线程运行时,线程和线程之间可能
 24 --会发生死锁
 25
 26 --死锁检测
 27 --上面列出的死锁SQL都能用他的死锁检测机制检测出来。死锁检测是由锁监视器
 28 --这个系统线程执行的,他会定期搜索SQL里的所有任务。默认时间间隔是5秒
 29
 30 --检测到死锁后,SQL会选择其中一个线程作为死锁牺牲品来结束死锁。数据库引擎
 31 --终止线程当前执行的批处理,回滚死锁牺牲品的事务,并将1205错误返回到
 32 --应用程序。回滚死锁牺牲品会释放事务持有的所有锁。这使其他线程的事务解锁
 33 --并继续运行。默认情况下,数据库引擎会选择运行回滚开销最小的事务的会话
 34 --作为死锁牺牲品
 35
 36
 37
 38 --死锁与阻塞的差别
 39 --很多用户会把死锁和阻塞混淆起来。当一个事务请求被其他事务锁定的资源上的锁时,
 40 --发出请求的事务会一直等待,直到该锁被别人释放,自己申请到为止。这时发生的
 41 --是阻塞。默认情况下,除非设置了SET LOCK_TIMEOUT 30 30为超时时间值
 42 --否则SQL事务会一直等下去,直到他自己超时为止。所以阻塞往往会持续很长时间
 43 --对称性的并发性能影响很大。有些人称这种现象为“锁死”,因为这种等待会一直
 44 --持续,SQL不会做出干预
 45
 46
 47
 48 --而死锁虽然是两个或多个进程之间的相互等待,但是由于SQL有数据库引擎死锁检测
 49 --方案,至少5秒钟会消除掉一个现有的死锁,所以对最终用户带来的影响是某些
 50 --指令请求失败,对性能影响往往没有像阻塞那么严重
 51
 52
 53 --问题定位
 54 --为了查看死锁信息,SQL提供了监视工具:两个跟踪标志:1204和1222
 55 --以及SQL Trace
 56
 57 --跟踪标志1204和跟踪标志1222
 58 --发生死锁时,跟踪标志1204和1222会向SQL错误日志返回捕获的信息
 59 --跟踪标志1204会报告由死锁所涉及的每个节点设置格式的死锁信息
 60 --他是SQL2005之前版本就有的功能。跟踪标志1222是SQL2005才开始
 61 --有的新功能,会设置死锁信息的格式,顺序为先按进程,然后按
 62 --资源。1222的结果不但基本包含了1204的所有信息,还包含许多1204
 63 --所没有的信息。所以在SQL2005以后可以直接使用跟踪标志1222来
 64 --跟踪死锁
 65
 66
 67 --打开跟踪标志
 68 DBCC TRACEON(1222,-1)
 69
 70 --和1204输出结果不同,1222的输出结果分成3个部分,并且由于信息量比较多,长度要比
 71 --1204的结果长很多.死锁的参与者不是用SPID来直接显示,而是用processXXXX的方法
 72 --所以需要有些耐心来看懂。但是,包含的内容比1204的输出丰富很多
 73
 74
 75 --1222包含3部分
 76 --第一部分:
 77 --死锁牺牲进程
 78
 79 --第二部分:process-list
 80 --死锁发生的进程信息
 81
 82 --第三部分:resource-list
 83 --发生死锁的资源信息
 84
 85
 86
 87 --死锁图形事件(locks-deadlock graph)
 88 --在SQL Trace中也有表示死锁所涉及的任务和资源的图形描述的事件
 89
 90 --要分析死锁的时候,一般结合跟踪标志1222和SQL Trace。首先在sql errorlog
 91 --里寻找跟踪标志1222的输出结果,根据输出的时间在跟踪里寻找相应的连接
 92 --接着就可以详细分析死锁产生的原因了
 93
 94
 95 ----------------------------解决办法---------------------------------------------------------------------
 96 --尽管死锁不能完全避免,但遵守特定的编码惯例可以将死锁发生的机会将至最低。
 97 --以下方法有助于将死锁减至最少:
 98 --按同一顺序访问对象
 99 --避免事务中的用户交互
100 --保持事务简短并处于一个批处理中
101 --使用较低的隔离级别
102 --调整语句的执行计划,减少锁的申请数目
103
104
105
106
107 --按同一顺序访问对象
108 --如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果
109 --两个并发事务先获取supplier(生产者)表上的锁,然后获取 consumer(消费者)表
110 --上的锁。则在其中一个事务完成之前,另一个事务将在supplier表上被阻塞
111 --当第一个事务提交或回滚之时,第二个事务将继续执行,这样就不会发生死锁
112
113
114 --避免事务中的用户交互
115 --避免编写包含用户交互的事务,因为没有用户干预的批处理的运行速度
116 --远快于用户必须手动响应查询时的速度。例如,如果事务正在等待用户
117 --输入,而用户去吃午餐甚至回家过周未,那用户就耽误了事务的完成
118 --这将降低系统的吞吐量,事务持有的任何锁只有在事务提交或回滚后
119 --才能释放。即使不出现死锁的情况,在占用资源的事务完成之前,访问
120 --同一资源的其他事务也会被阻塞
121
122
123 --保持事务简短并处于一个批处理中
124 --在同一数据库中并发执行多个需要长时间运行的事务会更容易发生死锁。
125 --事务的运行时间越长,他持有排他锁或更新锁的时间就越长,从而会
126 --阻塞其他活动并可能导致死锁
127 --保持事务处于一个批处理中可以最小化事务中的网络通信往返量,减少
128 --完成事务和释放锁可能遭遇的延迟
129
130
131 --使用较低的隔离级别
132 --确定事务是否能在较低的隔离级别上运行。使用较低的隔离级别(例如:已提交读)
133 --比使用较高的隔离级别(例如:可序列化)持有共享锁的时间更短。这样就
134 --减少了锁争用,可帮助避免阻塞和死锁
135
136
137 --调整语句的执行计划,减少锁的申请数目
138 --和阻塞类似,死锁产生的一大原因也是做一件事情需要申请比较多的资源。
139 --例如SQL需要扫描整张表才能找到修改的记录,而在扫描的过程中,SQL要
140 --为读到的每一条记录加锁。如果执行计划是seek,需要读的记录数目比较
141 --少,申请的锁数目也会比较少,可能就能避免死锁
142
143
144
145 --从上面的建议看,除了按同一顺序访问对象这个要求外,避免阻塞和死锁很多
146 --地方是相通的,所以采用的手段也很相似。唯一不同的是,有时候在高并发
147 --的情况下,可能死锁是很难避免的。这时候解决问题的手段之一,可以是
148 --提高连接申请的锁粒度,让死锁的一方先因为另一方已获取了一个粒度很高
149 --的锁(例如:页面锁甚至表锁)而先遇到阻塞。以暂时的阻塞代替死锁,
150 --使得双方能依次完成,虽然速度稍慢了一些
时间: 2024-10-12 02:39:56

牛人笔记----(死锁问题定位与解决方法)的相关文章

阻塞与死锁(三)——死锁的定位及解决方法

原文:阻塞与死锁(三)--死锁的定位及解决方法 死锁所在的资源和检测: 在SQL Server的两个或多个任务中,如果某个任务锁定了其他任务试图锁定的资源.会造成这些任务的永久阻塞,从而出现死锁. 下图为例: l  事务T1获得了行R1的共享锁. l  事务T2获得了行R2的共享锁. l  然后事务T1请求行R2的排它锁,但是T2完成并释放其对R2的共享锁之前被阻塞. l  T2请求行R1的排它锁,但是事务T1完成并释放其对R1持有的共享锁之前被阻塞. 现在T2与T1相互等待,导致了死锁.一般情

IE8 textarea 滚动条定位不准解决方法

工作中遇到一个bug: IE8 下textarea 如果带滚动条(height:100px;overflow:scroll-y;),内容高度超过可视区域之后,输入文字,滚动条位置会乱跳. 开始以为是js的问题,查看了代码感觉不是js的问题,于是借助索工具搜索了一番,这个问题感觉很少见,但是搜索之后发现确实有人遇到过这个问题. 也有些许的解决方案,经过几轮测试找到了最终的解决方案: textarea.fix-scroll{ width: 700px; min-width: 100%; max-wi

什么是死锁及死锁的必要条件和解决方法【转】

转自:http://blog.csdn.net/abigale1011/article/details/6450845/ 来自:http://blog.163.com/[email protected]/blog/static/128388169200982444858590/?fromdm&fromSearch&isFromSearchEngine=yes 进程死锁及解决办法 操作系统 2009-09-24 16:48:58 阅读767 评论1   字号:大中小 订阅 一.要点提示 (1

Android学习笔记——log无法输出的解决方法和命令行查看log日志

本人邮箱:[email protected],欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblogs.com/JohnTsai/p/3983936.html. 知识点 1.log无法输出的解决方法 2.通过命令行(command line)查看Android调试的log日志 log无法输出的解决方法 今天调试Android程序,发现Eclipse不输出log日志了.这让我很烦恼,程序调试的log都没法看到了.Google搜索了一些资料.发现stackoverflow上有很

牛人笔记----(死锁案例分析)

1 --死锁案例分析 P333 2 3 --先开启监视死锁的开关1222,让SQL遇到死锁时,在errorlog里打印出 4 --死锁的详细内容 5 6 DBCC TRACEON(1222,-1) 7 8 --这里使用范例表dbo.Employee_Demo_Heap 9 10 --这张表在EmployeeID和ManagerID字段上各有一个非聚集索引,但是没有聚集索引 11 12 13 --现在用下面脚本来模拟出一个死锁来.在一个连接里,运行下面语句,反复开启 14 --事务.在这个事务里,

【安全牛学习笔记】思路、身份认证方法、密码破解方法、字典

思路 目标系统实施了强安全措施 - 安装了所有补丁 - 无任何已知漏洞 - 无应用层漏洞 - 攻击面最小化 社会工程学 获取目标系统用户身份 - 非授权用户不守信,认证用户可以访问守信资源 - 已有用户账号权限受限,需要提权 - 不会触发系统报警 身份认证方法 证明你是声称你是的那个人 - 你知道什么(账号密码.pin.passphrase) - 你有什么(令牌.token.key.证书.密保.手机) - 你是谁(指纹.视网膜.虹膜.掌纹.声纹.面部识别) - 以上方法结合适用(多因素身份认证)

kail linux安装软件提示“无法定位软件包”解决方法

主要是更新源的问题,我安装ibus-pinyin老是提示"无法定位软件包" 最后我用的是163的源: # 163 源 deb http://mirrors.163.com/debian wheezy main non-free contrib deb-src http://mirrors.163.com/debian wheezy main non-free contrib deb http://mirrors.163.com/debian wheezy-proposed-update

Linux内核笔记 - 内核编译错误及解决方法记录

错误 1: /bin/sh: 1: lzop: not found make[2]: *** [arch/arm/boot/compressed/piggy.lzo] 错误 1 make[2]: *** 正在等待未完成的任务.... make[1]: *** [arch/arm/boot/compressed/vmlinux] 错误 2 make: *** [uImage] 错误 2 解决办法: sudo apt-get install lzop 错误 2: "mkimage" com

struts2学习笔记——常见报错及解决方法汇总(持续更新)

操作环境:(1)Tomcat 7.0.72.0 (2)OS Name: Windows 7  (3)JVM Version:  1.8.0_25-b18  (4)eclipse Version: Kepler Service Release 2 (5)struts2 version:struts2-core-2.5.10.1 1.通配符访问方法,报错404错误找不到页面 (1)错误原因:struts.xml中缺少<global-allowed-methods>regex:.*</glob