sql server中如何避免死锁
2014-03-27 13:13
274 查看
一、死锁的四个必要条件
1、互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
2、请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
3、非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
4、循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
二、 避免死锁
[align=left]1、按同一顺序访问对象[/align]
[align=left][/align]
如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得
Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在
Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。
[align=left] [/align]
[align=left][/align]
[align=left]2、避免事务中的用户交互[/align]
[align=left][/align]
[align=left]避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。[/align]
[align=left] [/align]
[align=left][/align]
[align=left]3、保持事务简短并在一个批处理中[/align]
[align=left][/align]
[align=left]在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。[/align]
[align=left][/align]
[align=left]保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。[/align]
[align=left] [/align]
[align=left][/align]
[align=left]4、使用低隔离级别[/align]
[align=left][/align]
[align=left]确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。[/align]
[align=left] [/align]
[align=left][/align]
[align=left]5、使用绑定连接[/align]
[align=left][/align]
[align=left]使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞[/align]
[align=left] [/align]
[align=left][/align]
6、SELECT语句加With(NoLock)提示
默认情况下SELECT语句会对查询到的资源加S锁(共享锁),S锁与X锁(排他锁)不兼容;但加上With(NoLock)后,SELECT不对查询到的资源加锁(或者加Sch-S锁,Sch-S锁可以与任何锁兼容);从而可以是这两条SQL可以并发地访问同一资源。当然,此方法适合解决读与写并发死锁的情况,但加With(NoLock)可能会导致脏读。
参考资料: sql server中的死锁 http://www.studyofnet.com/news/335.html
1、互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
2、请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
3、非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
4、循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
二、 避免死锁
[align=left]1、按同一顺序访问对象[/align]
[align=left][/align]
如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得
Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在
Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。
[align=left] [/align]
[align=left][/align]
[align=left]2、避免事务中的用户交互[/align]
[align=left][/align]
[align=left]避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。[/align]
[align=left] [/align]
[align=left][/align]
[align=left]3、保持事务简短并在一个批处理中[/align]
[align=left][/align]
[align=left]在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。[/align]
[align=left][/align]
[align=left]保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。[/align]
[align=left] [/align]
[align=left][/align]
[align=left]4、使用低隔离级别[/align]
[align=left][/align]
[align=left]确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。[/align]
[align=left] [/align]
[align=left][/align]
[align=left]5、使用绑定连接[/align]
[align=left][/align]
[align=left]使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞[/align]
[align=left] [/align]
[align=left][/align]
6、SELECT语句加With(NoLock)提示
默认情况下SELECT语句会对查询到的资源加S锁(共享锁),S锁与X锁(排他锁)不兼容;但加上With(NoLock)后,SELECT不对查询到的资源加锁(或者加Sch-S锁,Sch-S锁可以与任何锁兼容);从而可以是这两条SQL可以并发地访问同一资源。当然,此方法适合解决读与写并发死锁的情况,但加With(NoLock)可能会导致脏读。
参考资料: sql server中的死锁 http://www.studyofnet.com/news/335.html
相关文章推荐
- SQL Server里如何处理死锁 (转)
- SQL SERVER中如何解除死锁?
- SQL Server里如何处理死锁
- MS SQL Server:查询死锁进程(转载)
- SQL Server里在文件组间如何移动数据?
- 多线程死锁的产生以及如何避免死锁
- 如何通过 Transact-SQL SQL Server 中遍历一个结果集
- 在编写PL/SQL代码中使用SELECT语句时如何避免例外发生
- 如何将数据导入到 SQL Server Compact Edition 数据库中(四)
- SQl server 如何获得新增的自增长字段IDde 值 使用select @@IDENTITY能快速解决,但是怎么使用呢?
- 应用SQL Server DBCC避免堵塞
- 在sqlserver中如何对text类型的数据进行replace操作。 MS-SQL Server / 基础类 - CSDN社区 community.csdn.net
- 在SQL-server2005中如何对运行慢的查询进行分析?
- 什么是死锁,如何避免死锁?
- 如何将VFP本地表数据传送到SQL-Server后台进行更新
- 如何让server避免2MSL
- 如何启用匿名访问SQL Server Reporting Service 2008
- SQL Server中如何用非Sa角色打开Profiler
- 如何清空sql server sa密码
- 看看如何在安装vs2010后向sql2008添加SQL_Server_Management