你有时候就你喜欢的书。 --冯唐
1. SqlServer发生dead-lock 事件,主要是因为存在两个线程分别占有某个资源的独占锁,然后这两个线程再去获取对方拥有的资源的独占锁。这样就导致了dead-lock发生。
2. SqlServer 在遇到dead-lock后,会从两个线程中选取一个线程作为winner,winner的事务接着执行,另个线程则会成为loser,loser的事务则会rollback,对于loser,SqlServer则会给返回一个error message给应用程序,如果应用程序健壮,会处理这个error,得到了这个dead-lock error,则会再次提交刚才失败的事务。如果没有处理,则会出现错误。
3. 在SqlServer中可以利用Sql Server Profiler 来跟踪死锁的发生。具体过程如下:
3.1 选择相关事务,如下图:
若sql server 遇到死锁,列表中的事件就会被触发,从而可以跟踪判断是什么原因导致了dead-lock发生。
3.2 运行跟踪
需要将教务系统中遇到的dead-lock情况再次复现。让sql Server profiler来捕获。
3.3 分析跟踪
再获取到dead-lock的现象后,可以在profiler看到类似于下面这样的图:
其中图中可以看出,第9行出发了dead-lock events,可以看到具体的描述信息。在第13,14行可以看出,其中一个事务被强制rollback,另一个事务继续执行。其中第11行可以点击查看更详细的信息。看出具体是什么sql语句导致dead-lock,两个事务是在获取什么资源时发生dead-lock。
3.4 获取到这些信息之后,再结合具体的代码逻辑,做进一步的深入分析。
参考文档: