网管联盟 | 网管论坛 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 俱乐部 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > windows > 服务器技术 > SQL服务器 > 减少SQL Server数据库死锁的技巧  

减少SQL Server数据库死锁的技巧 评论 论坛

2003-06-19   作者:网管联盟整理   来源:中国网管联盟   PV:

关键词:技巧 数据库 减少 事务 7.0 适用于 6.5


  如果两个用户进程分别锁定了不同的资源,接着又试图锁定对方所锁定的资源,就会产生死锁。此时,SQL Server将自动地选择并中止其中一个进程以解除死锁,使得另外一个进程能够继续处理。系统将回退被中止的事务,并向被回退事务的用户发送错误信息。
  
  大多数设计良好的应用都会在接收到这个错误信息之后重新提交该事务,此时提交成功的可能性是很大的。但是,如果服务器上经常出现这种情况,就会显著地降低服务器性能。为避免死锁,设计应用应当遵循一定的原则,包括:
  
  
  
  ▲ 让应用每次都以相同的次序访问服务器资源。
  
  ▲ 在事务期间禁止任何用户输入。应当在事务开始之前收集用户输入。
  
  ▲ 尽量保持事务的短小和简单。
  
  ▲ 如合适的话,为运行事务的用户连接指定尽可能低的隔离级别。[适用于6.5,7.0,2000]
  
  
  
  此外,对于SQL Server的死锁问题,下面是几则实践中很有用的小技巧。
  
  
  ■ 使用SQL Server Profiler的Create Trace Wizard运行“Identify The Cause of a Deadlock”跟踪来辅助识别死锁问题,它将提供帮助查找数据库产生死锁原因的原始数据。[适用于7.0,2000] bitsCN.nET*中国网管博客
  
  ■ 如果无法消除应用中的所有死锁,请确保提供了这样一种程序逻辑:它能够在死锁出现并中止用户事务之后,以随机的时间间隔自动重新提交事务。这里等待时间的随机性非常重要,这是因为另一个竞争的事务也可能在等待,我们不应该让两个竞争的事务等待同样的时间,然后再在同一时间执行它们,这样的话将导致新的死锁。[适用于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] DL@bitsCN_com网管软件下载
  
  ■ 如果客户程序需要先用一定的时间检查数据,然后可能更新数据,也可能不更新数据,那么最好不要在整个记录检查期间都锁定记录。假设大部分时间都是检查数据而不是更新数据,那么处理这种特殊情况的一种方法就是:先选择出记录(不加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]
bbs.bitsCN.com

  
  ■ 如果用户抱怨说他们不得不等待系统完成事务,则应当检查服务器上的资源锁定是否是导致该问题的原因。进行此类检查时可以使用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]
  

收藏本文】 【推荐好友】 【欢迎投稿】 【打印本文
上一篇:用SQL 2000传输数据   下一篇:使SQL Server数据支持 XML
 相关文章:
·用SQL 2000传输数据 ·使SQL Server数据支持 XML
·用SQL Mail创建日常报告 ·SQL Server备份的三个恢复模型
·SQL Server到Oracle连接服务器的实现 ·通过SQL 模板提高工作效率
减少SQL Server数据库死锁的技巧 评论:
    评论加载中…
  
  责任编辑:网盟  声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
 
本类热门排行:
1.部署 Microsoft SQL Serv
2.通用SQL数据库查询语句精华使用简介
3.SQL入门:创建表
4.安装指南:SQL Server 2005安装及界面
5.在SQL Server 2000查询分析器里面收缩数
6.如何远程连接局域网内的sql server
7.SQL Server的数据类型介绍
8.剖析SQL Server 2005查询通知之基础篇
9.SQL Server定期自动备份
10.SQL Server 2005:数据类型最
最新推荐文章:
1.关于SQL Server中索引使用及维护简介
2.SQL Server数据在不同数据库中的应用
3.教你如何在SQL Server计算列和平均值
4.SQL Server 2005 - 实作CLR存储过程
5.部署 Microsoft SQL Server 2005 群集
6.SQL Server 2005与DB2 8.2之对比
7.专家谈SQL Server 2005 CLR
8.SQL Server 2005:向系统表说再见(图)
9.保护SQL服务器的安全-用户识别问题
10.如何应用SQL Server中的DBCC避免堵塞
本类最新文章:
1.50种方法巧妙优化SQL Server数据库
2.在SQL Server中使用CLR调用.NET方法
3.比较SQL Server约束和DML触发器
4.向外扩展SQL Server 实现更高扩展性
5.SQL Server 查询分析器快捷键集合
6.用SQL Server 2005同义字缩短开发时间
7.关于SQL Server中索引使用及维护简介
8.SQL Server数据在不同数据库中的应用
9.SQL Server如何访问sybase数据库的表
10.动态创建MSSQL数据库表存储过程
网管论坛交流:
·情人节快乐
·版主其实很辛苦(献给中国网管论坛所有版
·下雪了(精华哈)
·流量控制/限速讨论专贴(随时整理+更新
·经过了试用期,我自己写的述职报告!有用
·转网络中最美丽的行为
·过年了,早点回家看看爹娘
·图文并茂教你组建磁盘阵列
·计算机日常清洁维护方法
·郁闷啊,服务器修好了,可是……