SQL Server死锁的分析、处理与预防

本文详细介绍了SQL Server中的死锁现象,包括死锁的基本原理、一个死锁实例、检测与排查方法,如使用Profiler和系统存储过程。文章还探讨了多种处理死锁的方式,如自动处理、Kill会话、设置锁请求超时以及修改程序设计。重点强调了通过优化程序和数据库设计来预防死锁的重要性,提供了避免死锁的策略,如按顺序访问对象、保持事务简短和使用较低的隔离级别等。
摘要由CSDN通过智能技术生成

1、 基本原理 

所谓“死锁”,在操作系统的定义是:在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。 

定义比较抽象,下图可以帮助你比较直观的理解死锁:


出现死锁需要满足几个必要条件: a)互斥:进程独占资源,资源不共享; 

b)请求与保持:已经得到资源的进程可以再次申请新资源; c)不剥夺:已分配的资源不能被其它进程强制剥夺; 

d)环路等待:几个进程组成环路,都在相互等待正被占用的资源; 

对应到SQL Server中,在2个或多个任务中(insert、update、delete、select、alter table或Tran事务等等),如果每个任务锁定了其它任务想要锁定的资源,会造成这些任务永久阻塞,从而出现死锁。这些资源可能是:单行数据(RID、HEAP堆中的行)、索引中的键(KEY,行锁)、页(Page,8KB)、区(Extent,8个连续页)、堆或B树、表(Table,数据和索引)、文件(File,数据库文件)、整个数据库(DataBase)。 

如果系统中的资源不足或者资源分配策略不当,会导致因进程间的资源争用产生死锁现象。但更多的可能是程序员的程序有问题。“锁”有多种方式,如意向锁、共享锁、排他锁等等。锁还有多种粒度,如行锁、表锁。 

了解了死锁产生的原因,就可以最大可能的避免与预防死锁。只要上述4个必要条件中有1个不满足,就不会发生死锁。所以,在系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值