`
netxdiy
  • 浏览: 720631 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL Server 2008中SQL应用之-“死锁(Deadlocking)”

 
阅读更多

SQL Server 2008中SQL应用系列--目录索引

当一个用户会话(会话1)已经锁定了一个资源,而另一个会话(会话2)想要修改该资源,并且会话2也锁定了会话1想要修改的资源时,就会出现“死锁”(deadlocking)。在另一方释放资源前,会话1和会话2都不可能继续。所以,SQL Server会选择死锁中的一个会话作为“死锁牺牲品”。

注意:死锁牺牲品的会话会被杀死,事务会被回滚。

注意:死锁与正常的阻塞是两个经常被混淆的概念。

发生死锁的一些原因:

1、应用程序以不同的次序访问表。例如会话1先更新了客户然后更新了订单,而会话2先更新了订单然后更新了客户。这就增加了死锁的可能性。

2、应用程序使用了长时间的事务,在一个事务中更新很多行或很多表。这样增加了行的“表面积”,从而导致死锁冲突。

3、在一些情况下,SQL Server发出了一些行锁,之后它又决定将其升级为表锁。如果这些行在相同的数据页面中,并且两个会话希望同时在相同的页面升级锁粒度,就会产生死锁。

一、使用 SQL Server Profiler 分析死锁

http://msdn.microsoft.com/zh-cn/library/ms188246.aspx

二、使用跟踪标志位找出死锁

本文主要介绍使用DBCC TRACEON、DBCC TRACEOFF和DBCC TRACESTATUS命令来确保死锁被正确记录到SQL Server Management Studio SQL日志中。这些命令用来启用、关闭、和检查跟踪标志位的状态。

DBCC TRACEON,启用跟踪标志位。用法:DBCC TRACEON ( trace# [ ,...n ][ , -1 ] ) [ WITH NO_INFOMSGS ]

详细参看 MSDN:http://msdn.microsoft.com/zh-cn/library/ms187329.aspx

DBCC TRACESTATUS,检查跟踪标志位状态。用法:DBCC TRACESTATUS ( [ [ trace# [ ,...n ] ] [ , ] [ -1 ] ] ) [ WITH NO_INFOMSGS ]

详细参看 MSDN:http://msdn.microsoft.com/zh-cn/library/ms187809.aspx

DBCC TRACEOFF,关闭跟踪标志位。用法:DBCC TRACEOFF (trace# [ ,...n ] [ , -1 ] ) [ WITH NO_INFOMSGS ]

详细参看 MSDN:http://msdn.microsoft.com/en-us/library/ms174401.aspx

下面我们模拟一个死锁:

在第一个SQL查询窗口执行:

在第二个查询窗口执行:

等待几秒后,其中一个查询窗口会提示:

此时,查看,SQL Server Management Studio的SQL 日志,发现死锁事件没有被记录。

打开第三个查询窗口,执行:

为了模拟另一个死锁,将重启动“胜利”的那个连接查询(没有被杀死的那个),然后重启死锁丢失的会话,几秒后又出现另一个死锁了。

死锁发生后,停止另一个执行的查询。现在,SQL Server Management Studio的SQL 日志中包含了死锁事件的详细错误信息。包括相关的数据库和对象、锁定模式以及死锁中的SQL语句。
邀月工作室

在检查完毕后,关闭跟踪标志位:

解析:

在本例中,我们使用跟踪标志位1222。跟踪标志位1222能把详细的死锁信息返回到SQL日志中,标志位-1表示跟踪标志位1222应该对所有SQL Server连接在全局中启用。

三、设置死锁优先级

我们也可以使用SET DEADLOCK_PRIORITY命令来增加一个查询会话被选为死锁牺牲品的可能性。此命令的语法如下:

SET DEADLOCK_PRIORITY { LOW | NORMAL | HIGH | <numeric-priority> | @deadlock_var | @deadlock_intvar }
<numeric-priority> ::= { -10 | -9 | -8 | … | 0 | … | 8 | 9 | 10 }

http://msdn.microsoft.com/en-us/library/ms186736.aspx

例如,上例中,第一个查询窗口如果使用以下的死锁优先级命令,几乎可以肯定会被选为死锁牺牲品。(正常情况下,SQL Server会把它认为取消或回滚代价最小的连接作为默认的死锁牺牲品):


解析:可以将优先级设为High或Normal,High表示除非另一个会话有相同的优先级,否则它不会被选为牺牲品。Normal是默认行为,如果另一个会话是High,它可能会被选中。如果另一个是Low,则它可以安全地不被选中。如果两个会话有相同的优先级,则回滚代价最小的事务会被选中。

关于死锁的其他资源,可能会有补充:

happyhippySQL Server死锁总结,也总结的不错。

http://www.cnblogs.com/happyhippy/archive/2008/11/14/1333922.html

邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助! 3w@live.cn
分享到:
评论

相关推荐

    SQLServer2008技术内幕:T-SQL查询

    通过对《SQLServer2008技术内幕:T-SQL查询》的学习,读者可以全面掌握SQL Server 2008中的T-SQL查询,从而更好地设计、实施和优化数据库应用。无论是数据库开发者还是管理员,都能从中受益匪浅。

    SQL SERVER 2008 R2 查看和杀死死锁进程

    SQL SERVER 2008 R2 查看和杀死死锁进程。数据库进程死锁是一个很严重的问题,快速定位到死锁的进程尤为重要。

    SQL2008中SQL应用之- 死锁(Deadlocking)

    在SQL Server 2008中,死锁是指两个或多个并发事务互相等待对方释放资源,从而导致它们都无法继续执行的情况。当出现死锁时,SQL Server会选择一个会话作为"死锁牺牲品",结束该会话的事务并回滚其操作,以此来打破...

    sqlserver如何快速查询死锁语句

    在SQL Server数据库管理系统中,死锁是一个常见的性能问题,它发生在两个或多个事务相互等待对方释放资源,导致它们都无法继续执行。死锁不仅影响数据库的正常运行,还可能导致数据一致性问题。本文将详细介绍如何在...

    Microsoft SQL Server 2008 Internals (PDF 高清版)

    ### Microsoft SQL Server 2008 Internals #### 前言 本书《Microsoft SQL Server 2008 Internals》是由Paul S. Randal、Kimberly L. Tripp、Conor Cunningham、Adam Machanic 和 Ben Nevarez共同编写的,并由...

    深入解析sqlserver 2008 Microsoft SQL Server 2008 Internals

    3. **事务与并发控制**:书中深入剖析了SQL Server 2008的事务管理机制,包括ACID属性、快照隔离级别和行版本控制,以及并发问题如死锁检测和避免。 4. **备份与恢复**:备份和恢复是数据库管理的重要环节,书中...

    SQL Server 2005数据库技术与应用-教程

    在SQL Server 2005中,你可以利用BEGIN TRANSACTION、COMMIT和ROLLBACK语句来管理事务,理解并发控制(如锁机制)和死锁解决方案也是必备技能。 备份和恢复是数据库管理的重要环节。SQL Server 2005提供了多种备份...

    SQL Server死锁的解除方法

    "SQL Server死锁的解除方法" SQL Server死锁是指在多个事务之间的资源竞争时,出现的循环等待资源的现象。死锁会导致系统性能下降,甚至会导致系统崩溃。因此,解决SQL Server死锁是非常重要的。 SQL Server死锁的...

    (第二卷)Microsoft SQL Server 2008技术内幕:T-SQL语言基础

     《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》是Microsoft SQL Server 2008系列中的一本。书中全面深入地介绍了T-SQL的基本元素,以及SQL Server 2008中新增加的一些特性。主要包括SQL的基础理论、逻辑...

    通过SQL Server Profiler来监视分析死锁

    在SQL Server数据库管理中,死锁是一个常见的性能问题,它发生在两个或多个事务相互等待对方释放资源时。本文将深入探讨如何使用SQL Server Profiler工具来监视和分析死锁,以便更好地理解和解决这类问题。 首先,...

    sql server 2005 技术内幕t-sql查询源码

    阐述事务的ACID属性,以及SQL Server中的事务管理,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)隔离级别,同时可能涉及死锁问题及解决...

    SQLServer排查死锁

    在处理SQL Server数据库中的死锁问题时,一个非常实用的工具就是SQL Server Profiler。它可以帮助我们捕捉到数据库运行过程中的各种事件,并通过这些事件分析问题发生的根源。下面我们将详细介绍如何使用SQL Server ...

    Microsoft SQL Server 2008 T-SQL Fundamentals

    《Microsoft SQL Server 2008 T-SQL Fundamentals》是一本专为SQL Server初学者设计的教程,它深入浅出地介绍了Transact-SQL(T-SQL)的基础知识。T-SQL是SQL Server中用于数据查询、更新、操作和编程的主要语言。...

    SQL SERVER 2005/2008 Express Profiler

    SQL Server 2005/2008 Express Profiler 是微软SQL Server数据库管理系统中一个强大的性能监视工具,尤其适用于SQL Server 2008 Express版本。它允许开发者和DBA(数据库管理员)深入地洞察数据库系统的运行情况,...

    (第一卷)Microsoft.SQL.Server.2008技术内幕:T-SQL语言基础

     《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》是Microsoft SQL Server 2008系列中的一本。书中全面深入地介绍了T-SQL的基本元素,以及SQL Server 2008中新增加的一些特性。主要包括SQL的基础理论、逻辑...

    SQL Server死锁产生的原因及解决办法

    SQL Server死锁是数据库...总的来说,解决SQL Server中的死锁问题需要综合考虑数据库设计、事务管理、应用程序逻辑等多个层面,通过合理的资源调度和事务处理策略,可以显著减少死锁的发生,提升系统的稳定性和性能。

    检查 Sql Server的阻塞和死锁

    检查 Sql Server的阻塞和死锁--------------------------------------------

    数据库原理及应用 课后答案SQl server 2008 课后答案 1-6章(图片版)

    数据库原理及应用是计算机科学中的核心课程之一,主要讲解如何设计、实现和管理数据库系统。SQL Server 2008是Microsoft公司推出的一款强大的关系型数据库管理系统,广泛应用于企业级数据存储和处理。本资源提供了该...

    自动杀掉SQLSERVER中的死锁进程

    本过程自动捕捉SQLSERVER中的死锁进程并且自动杀掉

Global site tag (gtag.js) - Google Analytics