在平时项目中碰到过好几次事务(transaction)死锁
![](/icons/91994de.gif)
情况
![](/icons/91994dou.gif)
相信用过事务
![](/icons/91994de.gif)
朋友都有过类似问题
![](/icons/91994dou.gif)
下面来写写事务
![](/icons/91994de.gif)
死锁
死锁
![](/icons/91994yi.gif)
般由数据库
![](/icons/91994de.gif)
锁造成
![](/icons/91994de.gif)
![](/icons/91994dou.gif)
事务
![](/icons/91994de.gif)
锁有两种是最常遇到
![](/icons/91994de.gif)
![](/icons/91994dou.gif)
![](/icons/91994yi.gif)
种是共享锁(S)
![](/icons/91994dou.gif)
另
![](/icons/91994yi.gif)
种是排他锁(X)
![](/icons/91994dou2.gif)
简单
![](/icons/91994de.gif)
说共享锁就是在读数据时加
![](/icons/91994de.gif)
锁
![](/icons/91994dou.gif)
排他锁就是在又读又写时加
![](/icons/91994de.gif)
锁
![](/icons/91994dou.gif)
不过可以用NOLOCK来对加了排他锁
![](/icons/91994de.gif)
数据进行读取
![](/icons/91994dou2.gif)
如果在某个事务中
![](/icons/91994de.gif)
某个锁或者某些锁没有正常释放时
![](/icons/91994dou.gif)
就会发生死锁
![](/icons/91994dou2.gif)
很常见
![](/icons/91994de.gif)
![](/icons/91994yi.gif)
种情况是在
![](/icons/91994yi.gif)
个事务中
![](/icons/91994de.gif)
某个SQL语句发生了
![](/icons/91994cuowu.gif)
而导致
![](/icons/91994chengxu.gif)
没有正常结束
![](/icons/91994dou.gif)
所以没有执行到出错代码段后面
![](/icons/91994de.gif)
commit或者rollback时
![](/icons/91994dou.gif)
这个事务中
![](/icons/91994de.gif)
锁就不会被释放
![](/icons/91994dou.gif)
从而造成事务
![](/icons/91994de.gif)
死锁
![](/icons/91994dou2.gif)
死锁
![](/icons/91994de.gif)
现象很明显
![](/icons/91994de.gif)
就是在执行SQL语句数据库会
![](/icons/91994yi.gif)
直执行而没有响应
在发生死锁时
![](/icons/91994dou.gif)
要先找到这个事务
![](/icons/91994de.gif)
进程ID然后再kill这个进程
![](/icons/91994dou.gif)
![](/icons/91994yi.gif)
般就能解决
![](/icons/91994dou2.gif)
在SQLServer里可以用sp_lock查看进程
![](/icons/91994de.gif)
状态和ID然后再用kill命令来杀死这个进程
![](/icons/91994dou2.gif)
当然如果数据库服务器
![](/icons/91994de.gif)
服务不多时并且很好启动时
![](/icons/91994dou.gif)
可以简单
![](/icons/91994de.gif)
重启服务来解决
当然除了共享锁和排他锁
![](/icons/91994dou.gif)
事务还有其他类型
![](/icons/91994de.gif)
锁
![](/icons/91994dou.gif)
大家可以去下面这个地址看看
![](/icons/91994dou.gif)
很详细
http://technet.microsoft.com/zh-cn/library/ms175519(SQL.90).aspx
延伸阅读
最新评论