首页 > 开发 > 综合 > 正文

SQLServer中死锁产生的原因及解决办法

2024-07-21 02:12:02
字体:
来源:转载
供稿:网友

其实所有的死锁最深层的原因就是一个:资源竞争
表现一:
一个用户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 ....

 

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表