死锁(死锁)是指进程间互相永久阻塞的状态,可能涉及两个或多个进程例如:进程甲阻塞了进程B,而进程乙又阻塞了进程A.或者进程甲阻塞了进程B,进程B阻塞了进程C,进程C阻塞了进程A.在任何一种情况下,SQL Server都可以检测阻塞,并选择终止其中一个事务以干预死锁状态。
除非指定了其他方式,SQL Server会选择终止做过操作最少的事务,因为这样可以让开销降低到最小。不过,用户也可以自己指定死锁情况下会话的优先级(DEADLOCK_PRIORITY)。
那么我们怎么减少死锁呢?
显然,事务的处理时间越长,持有锁的时间就越长,死锁的可能性就越大。应该尽可能保持事务简短,在逻辑上将不属于同一工作单元的操作移到事务之外。
将两个事务按同样的顺序来访问资源,也可以避免死锁。
建立良好的索引支持也能避免死锁。例如:连接1中对订单表中的ID为1的进行操作,连接2中对订单表中的ID为2的进行操作,所以他们不应该产生冲突但是如果在订单表中没有索引来支持查询筛选,SQL Server就必须进行全表扫描(并锁定)所有行。这样当然会造成死锁。