其实所有的死锁最深层的原因就是一个:资源竞争。
表现一:
一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A。这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了。
同样用户B要等用户A释放表A才能继续这就死锁了。
解决方法:
这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法。
仔细分析你程序的逻辑:
1:尽量避免同时锁定两个资源;
2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。
表现二:
用户A读一条纪录,然后修改该条纪录,这是用户B修改该条纪录,这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。
这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。
解决方法:
让用户A的事务(即先读后写类型的操作),在select 时就是用Update lock
语法如下:
select * from table1 with(updlock) where .... |
分享到:
相关推荐
本文举例说明SQL Server死锁产生的原因,并提出了解决的办法。
本过程自动捕捉SQLSERVER中的死锁进程并且自动杀掉
SQL Server死锁使我们经常遇到的问题,下面就为您介绍如何查询SQL Server死锁,希望对您学习SQL Server死锁方面能有所帮助。
死锁原理、死锁排查、避免死锁、死锁处理方法、两个死锁示例及解决方法、附:锁兼容性(FROM SQL Server 2005 联机丛书)
浅析SQL SERVER死锁产生的原因及解决.pdf
查询SQL server数据库死锁存储过程
在SQL Server 2005中解决死锁问题
SQLSERVER死锁总结,里面详述基于SQLSERVER数据库如何排查并处理死锁的办法,及死锁产生的原因
在sql server 运行过程中,容易产生死锁,该代码提供了一个查询死锁进程并抛弃的方法。供参考。
如何使用SQL Server Profiler来监控数据库死锁。SQL Server Profiler配置及查看锁表信息,提取锁表日志和对应SQL语句。
Sqlserver分析死锁进程,分析死锁的进程ID号
sqlserver 解除死锁,网络上看到的很实用分享给大一起用
用于sqlserver优化使用,可定位死锁,并查询死锁语句。
sqlserver数据库死锁的处理过程,内有说明,测试过,比较好用。
可以完美发现和杀死死锁用户,有测试实例!
日常SQL Server出现事物锁表,查询锁表信息
分析SQL Server 数据库中的死锁
浅议SQL Server中死锁的产生和解决对策.pdf
浅析SQL SERVER中死锁.pdf