如何减少SQL Server数据库死锁

如果两个用户进程分别锁定了不同的资源,接着又试图锁定对方所锁定的资源,就会产生死锁。此时 ,SQL Server将自动地选择并中止其中一个进程以解除死锁,使得另外一个进程能够继续处理。系统将回 退被中止的事务,并向被回退事务的用户发送错误信息。

大多数设计良好的应用都会在接收到这个错误信息之后重新提交该事务,此时提交成功的可能性是很 大的。但是,如果服务器上经常出现这种情况,就会显著地降低服务器性能。为避免死锁,设计应用应当 遵循一定的原则,包括:

◆让应用每次都以相同的次序访问服务器资源。

◆在事务期间禁止任何用户输入。应当在事务开始之前收集用户输入。

◆尽量保持事务的短小和简单。

◆如合适的话,为运行事务的用户连接指定尽可能低的隔离级别。[适用于6.5,7.0,2000]

此外,对于SQL Server的死锁问题,下面是几则实践中很有用的小技巧。

◆使用SQL Server Profiler的Create Trace Wizard运行“Identify The Cause of a Deadlock”跟踪来辅助识别死锁问题,它将提供帮助查找数据库产生死锁原因的原始数据。[适用于 7.0,2000]

◆如果无法消除应用中的所有死锁,请确保提供了这样一种程序逻辑:它能够在死锁出现并中止用户事 务之后,以随机的时间间隔自动重新提交事务。这里等待时间的随机性非常重要,这是因为另一个竞争的 事务也可能在等待,我们不应该让两个竞争的事务等待同样的时间,然后再在同一时间执行它们,这样的 话将导致新的死锁。[适用于6.5,7.0,2000]

◆尽可能地简化所有T-SQL事务。此举将减少各种类型的锁的数量,有助于提高SQL Server应用的整体 性能。如果可能的话,应将较复杂的事务分割成多个较简单的事务。[适用于6.5,7.0,2000]

◆所有条件逻辑、变量赋值以及其他相关的预备设置操作应当在事务之外完成,而不应该放到事务之 内。永远不要为了接受用户输入而暂停某个事务,用户输入应当总是在事务之外完成。[适用于6.5,7.0 ,2000]

◆在存储过程内封装所有事务,包括BEGIN TRANSACTION和COMMIT TRANSACTION语句。此举从两个方面 帮助减少阻塞的锁。首先,它限制了事务运行时客户程序和SQL Server之间的通信,从而使得两者之间的 任何消息只能出现于非事务运行时间(减少了事务运行的时间)。其次,由于存储过程强制它所启动的事务 或者完成、或者中止,从而防止了用户留下未完成的事务(留下未撤销的锁)。[适用于6.5,7.0,2000]

◆如果客户程序需要先用一定的时间检查数据,然后可能更新数据,也可能不更新数据,那么最好不 要在整个记录检查期间都锁定记录。假设大部分时间都是检查数据而不是更新数据,那么处理这种特殊情 况的一种方法就是:先选择出记录(不加UPDATE子句。UPDATE子句将在记录上加上共享锁),然后把它发送 给客户。

如果用户只查看记录但从来不更新它,程序可以什么也不做;反过来,如果用户决定更新某个记录,那 么他可以通过一个WHERE子句检查当前的数据是否和以前提取的数据相同,然后执行UPDATE。

类似地,我们还可以检查记录中的时间标识列(如果它存在的话)。如果数据相同,则执行UPDATE操作; 如果记录已经改变,则应用应该提示用户以便用户决定如何处理。虽然这种方法需要编写更多的代码,但 它能够减少加锁时间和次数,提高应用的整体性能。[适用于6.5,7.0,2000]

◆尽可能地为用户连接指定具有最少限制的事务隔离级别,而不是总是使用默认的READ COMMITTED。 为了避免由此产生任何其他问题,应当参考不同隔离级别将产生的效果,仔细地分析事务的特性。[适用 于6.5,7.0,2000]

◆使用游标会降低并发性。为避免这一点,如果可以使用只读的游标则应该使用READ_ONLY游标选项, 否则如果需要进行更新,尝试使用OPTIMISTIC游标选项以减少加锁。设法避免使用SCROLL_LOCKS游标选项 ,该选项会增加由于记录锁定引起的问题。[适用于6.5,7.0,2000]

◆如果用户抱怨说他们不得不等待系统完成事务,则应当检查服务器上的资源锁定是否是导致该问题 的原因。进行此类检查时可以使用SQL Server Locks Object: Average Wait Time (ms),用该计数器来 度量各种锁的平均等待时间。

如果可以确定一种或几种类型的锁导致了事务延迟,就可以进一步探究是否可以确定具体是哪个事务 产生了这种锁。Profiler是进行这类具体分析的最好工具。[适用于7.0,2000]

◆使用sp_who和sp_who2(SQL Server Books Online没有关于sp_who2的说明,但sp_who2提供了比 sp_who更详细的信息)来确定可能是哪些用户阻塞了其他用户。[适用于6.5,7.0,2000]

◆试试下面的一个或多个有助于避免阻塞锁的建议:1)对于频繁使用的表使用集簇化的索引;2)设法避 免一次性影响大量记录的T-SQL语句,特别是INSERT和UPDATE语句;3)设法让UPDATE和DELETE语句使用索引 ;4)使用嵌套事务时,避免提交和回退冲突。[适用于6.5,7.0,2000]

时间: 2025-01-31 05:45:49

如何减少SQL Server数据库死锁的相关文章

优化SQL Server数据库查询方法

SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没有优

SQL Server数据库的高性能优化经验总结

小编以前在做ASP及.NET的时候经常用到SQL SERVER,现在用PHP虽然大多数时候用MYSQL,但不泛有些客户要在原来SQL的平台上升级或兼容开发,值得庆幸的是PHP无所不能,基本上所有的数据库它都能连接并支持,本文主要向大家介绍的是正确优化SQL Server数据库的经验总结,其中包括在对其进行优化的实际操作中值得大家注意的地方描述,以及对SQL语句进行优化的最基本原则,以下就是文章的主要内容描述. 优化数据库的注意事项: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵

SQL Server数据库常用的T

1. 查看数据库的版本 select @@version 2.查看数据库所在机器操作系统参数 exec master..xp_msver 3. 查看数据库启动的参数 sp_configure 4.查看数据库启动时间 select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 查看数据库服务器名和实例名 print ''Server Name...............: '' + conve

强烈推荐:SQL Server数据库操作实用技巧锦集

server|sql|技巧|数据|数据库 本文主要概括安装时提示有挂起的操作.收缩数据库.压缩数据库.转移数据库给新用户以已存在用户权限.检查备份集.修复数据库等操作技巧. 1.挂起操作 在安装SQL或SP补丁的时候系统提示之前有挂起的安装操作,要求重启,这里往往重启无用,解决办法: 到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager删除PendingFileRenameOperations. 2.收缩数据库

MS SQL Server数据库查询优化及分页算法

server|分页|数据|数据库|算法|优化 探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的"红头文件"一表的部分数据结构:CREATE TABLE [dbo].[TGongwen] (    --TGongwen是红头文件表名    [Gid] [int] IDENTITY (1, 1) NOT NULL ,--本表的id号,也是主键    [title] [varchar] (80) COLLATE

SQL Server数据库性能的优化

server|数据|数据库|性能|优化 编者按:数据库性能优化和数据库管理系统密切相关,不同的数据库管理系统在具体操作上有很大不同.继本报连续在2003年第48期.49期上刊登<Sybase数据库性能调优>和<Oracle服务器性能调整攻略>,分别讨论了Sybase和Oracle数据库管理系统以后,本期我们将具体介绍SQL Server数据库的性能优化方法. 数据库是企业信息的核心,其应用水平的高低直接影响到企业管理水平.选择了一个高性能的数据库产品不等于就有一个好的数据库应用系统

用VB备份和恢复SQL Server数据库的方法

server|备份|恢复|数据|数据库 摘要 备份与恢复是数据库管理员维护数据库安全性和完整性的重要操作.本文分析并介绍用Access备份SQL数据库的方法,很好地达到了数据备份的目的.同时,就Access 数据库的安全接口作了简略讨论,使备份后不致丧失数据安全性.并提出了改进备份与恢复策略的一些建议. 引言 对于关键应用的数据库系统应根据具体环境和条件制订一个完善可行确保系统安全的备份计划,没有备份的系统是不可靠.危险的,后果将是严重的,破坏性病毒.误操作.自然灾害等等都可能会对数据库系统造成

从外到内提高SQL Server数据库性能

如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能.如下图: 第一层:网络环境. 到企业碰到数据库反映速度比较慢时,首先想到的是是否是网络环境所造成的.而不是一开始就想着如何去提高数据库的性能.这是很多数据库管理员的一个误区.因为当网络环境比较恶劣时,你就算再怎么去改善数据库性能,也是枉然. 如以前有个客户,向笔者反映数据库响应时间比较长,让笔者给他们一个提高数据库性能的解决方案.那时,笔者感到很奇怪.因为据笔者所知,这家客户数据库的

从客户端提升SQL Server数据库性能

第一:编写限制搜索范围的查询语句. 众所周知,在数据库查询的时候返回记录的多少直接关系到查询的效率.所以,在客户端通过一定的条件语句,限制搜索的范围,往往可以大幅度的提高查询的效率. 如用户在客户端查询数据库的时候,在查询语句中,加入TOP语句,让其显示前面的50条或者100条记录.因为根据经验,用户在查询数据的时候,60%左右要查看的都是靠前面的记录.特别是在一些历史交易信息表中,如在ERP系统的库存交易表中,就可以只显示前面几百条的记录,而不需要显示所有的记录.当用户觉得记录不够时,可以按"