SQL Server dead-lock 分析

你有时候就你喜欢的书。 --冯唐

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   获取到这些信息之后,再结合具体的代码逻辑,做进一步的深入分析。

 参考文档:

http://www.simple-talk.com/sql/learn-sql-server/how-to-track-down-deadlocks-using-sql-server-2005-profiler/

posted @ 2012-10-15 15:59  臭蛋  阅读(723)  评论(0编辑  收藏  举报