[转载]SQL Server里面Deadlock 似乎无可避免 – Procez One 基于.Net 的工作流 – 博客园.
从SQL Server的Online Book里面描述Deadlock策略里面发现有下面的一种情况:
Worker threads. A queued task waiting for an available worker thread can cause deadlock. If the queued task owns resources that are blocking all worker threads, a deadlock will result. For example, session S1 starts a transaction and acquires a shared (S) lock on row r1 and then goes to sleep. Active sessions running on all available worker threads are trying to acquire exclusive (X) locks on row r1. Because session S1 cannot acquire a worker thread, it cannot commit the transaction and release the lock on row r1. This results in a deadlock.
左边的进程完全就是一个普通的查询语句,对资源上的也只是一个共享锁(S).而右边的进程是上了一个Index的排它锁(IX).跟通常意义上的两边都上排它锁才可能产生死锁的情况完全不一样,下面的图是我们写程序可以避免的死锁情况
里面提到了,要避免的Deadlock,把不同事务里面两个Update或者Insert资源的操作锁定资源顺序保持一致是最基本的,不过也就是能避免第二张图里面出现的情况。
- 而要避免第一张图的情况好像是不太可能,除非你每个SQL 语句都加上With Nolock,第一张图的情况基本上只能够通过减少查询时间,减少事务处理的时间来减少而无可避免。