SQL Server 2008 R2(.Net 2.0 应用程序)中的死锁问题

2023-12-25

所讨论的 Sql Server 2008 R2 实例是一个重负载 OLTP 生产服务器。几天前出现了僵局问题,但仍未解决。我们收到了 Xml 死锁报告,其中列出了死锁涉及的存储过程以及其他一些详细信息。我将首先尝试列出此 xml 中的事实:

死锁涉及两个存储过程,即 SP1 和 SP2。据报道SP1 正在隔离级别“可串行化”下运行 and SP2 正在“ReadCommissed”状态下运行.

我们调查了以下内容:

  • 我们是否设置 SP1 的 IsolationLevel 到 SP 内或中的“可序列化” 代码? - 不。

  • 是否有任何其他 SP,其 IsolationLevel 是“可序列化”调用 SP1 吗? - 不。

  • SP1 使用的表是否被调用 任何其他具有隔离功能的 SP 级别为“可序列化”? - 是的。 有些 SP 具有隔离功能 级别设置为“可序列化”并且 访问与 SP1 相同的表, 但我们不知道他们是否 当时正在运行 死锁与否作为死锁
    报告仅显示 SP1 和 SP2。

思路:
我们考虑了以下可能的原因:

  • 发生死锁是因为 SP1 处于 作为“可序列化”运行。 - 为什么是 此 SP 运行在 Serialized 时 我没设置过吧?是否隔离 级别升级(就像锁一样)?如果 我们弄清楚了这一点并让它运行 ReadCommited,问题会是 解决?

  • 任何其他 SP 正在运行,锁定 SP1 使用的表并导致 SP1 和 SP2 之间出现死锁。 - 这个 SP 不会列在 僵局报告?能否陷入僵局 报告错过了这样的依赖关系?如果是 那么我们可能只得到部分 信息。这还是不行 解决 SP1 的运行方式 不过,可序列化。

建议:

  • 如果此信息不充分 在解决问题时,我怎样才能 从SQL获取更多信息 服务器用于我的目的以及什么 我应该尝试收集信息吗?

  • 您认为的任何其他思路 追求解决这个问题?

Update:
这是跟踪日志信息为了僵局。我已经更改了 SP 等的名称,但已检查并验证这些更改不会遗漏任何相关信息。检查代码后面的注释以获取有关表格等的更多信息。

?<EVENT_INSTANCE>
  <EventType>DEADLOCK_GRAPH</EventType>
  <PostTime>2010-09-07T11:27:47.870</PostTime>
  <SPID>16</SPID>
  <TextData>
    <deadlock-list>
      <deadlock victim="process5827708">
        <process-list>
          <process id="process5827708" taskpriority="0" logused="0" waitresource="KEY: 7:72057594228441088 (8d008a861f4f)"
                   waittime="5190" ownerId="1661518243" transactionname="SELECT" lasttranstarted="2010-09-07T11:27:42.657"
                   XDES="0x80bf3b50" lockMode="RangeS-S" schedulerid="4" kpid="2228" status="suspended" spid="76" sbid="0"
                   ecid="0" priority="0" trancount="0" lastbatchstarted="2010-09-07T11:27:42.657"
                   lastbatchcompleted="2010-09-07T11:27:42.657" clientapp=".Net SqlClient Data Provider"
                   hostname="xxx" hostpid="5988" loginname="xxx" isolationlevel="serializable (4)"
                   xactid="1661518243" currentdb="7" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056">
            <executionStack>
              <frame procname="SP1" line="12" stmtstart="450" stmtend="6536"
                     sqlhandle="0x0300070090cbdc7742720c00e99d00000100000000000000">
                Select ... from Table1, Table2, Table4, Table5
              </frame>
            </executionStack>
            <inputbuf>
              Proc [Database Id = 7 Object Id = 2010958736]
            </inputbuf>
          </process>
          <process id="process5844bc8" taskpriority="0" logused="1873648" waitresource="KEY: 7:72057594228441088 (0e00ce038ed0)"
                   waittime="4514" ownerId="1661509575" transactionname="user_transaction" lasttranstarted="2010-09-07T11:27:40.423"
                   XDES="0x37979ae90" lockMode="X" schedulerid="7" kpid="3260" status="suspended" spid="104" sbid="0" ecid="0"
                   priority="0" trancount="2" lastbatchstarted="2010-09-07T11:27:43.350" lastbatchcompleted="2010-09-07T11:27:43.350"
                   clientapp=".Net SqlClient Data Provider" hostname="xxx" hostpid="5988" loginname="xxx"
                   isolationlevel="read committed (2)" xactid="1661509575" currentdb="7" lockTimeout="4294967295"
                   clientoption1="673185824" clientoption2="128056">
            <executionStack>
              <frame procname="SP2" line="68" stmtstart="5272" stmtend="5598"
                     sqlhandle="0x030007003432350f109a0c00e99d00000100000000000000">
                UPDATE Table1 ...
              </frame>
            </executionStack>
            <inputbuf>
              Proc [Database Id = 7 Object Id = 255144500]
            </inputbuf>
          </process>
        </process-list>
        <resource-list>
          <keylock hobtid="72057594228441088" dbid="7" objectname="Table1" indexname="Index1"
                   id="lock448e2c580" mode="X" associatedObjectId="72057594228441088">
            <owner-list>
              <owner id="process5844bc8" mode="X" />
            </owner-list>
            <waiter-list>
              <waiter id="process5827708" mode="RangeS-S" requestType="wait" />
            </waiter-list>
          </keylock>
          <keylock hobtid="72057594228441088" dbid="7" objectname="Table1" indexname="Index1"
                   id="lock2ba335880" mode="RangeS-S" associatedObjectId="72057594228441088">
            <owner-list>
              <owner id="process5827708" mode="RangeS-S" />
            </owner-list>
            <waiter-list>
              <waiter id="process5844bc8" mode="X" requestType="wait" />
            </waiter-list>
          </keylock>
        </resource-list>
      </deadlock>
    </deadlock-list>
  </TextData>
  <TransactionID />
  <LoginName>xx</LoginName>
  <StartTime>2010-09-07T11:27:47.867</StartTime>
  <ServerName>xxx</ServerName>
  <LoginSid>xxx</LoginSid>
  <EventSequence>116538375</EventSequence>
  <IsSystem>1</IsSystem>
  <SessionLoginName />
</EVENT_INSTANCE>

SP1 正在执行从 5 个不同表(Table1 到 Table5)获取数据的选择(使用内部查询等)。SP2 对 Table1 执行更新。
有趣的是,SP2 更新的列之一是 Table1 中的外键字段和 Table2 的主键,而 Table1 和 Table2 都是 SP1 的 select 语句的一部分,不确定这是否相关,但不想错过任何事物。

注意:indexname="Index1"(在上面的死锁图中)--Index1 与 Table1 中的外键和 Table2 中的主键位于同一列上。


检查这个MSDN 文章 http://msdn.microsoft.com/en-us/library/tcbchxcb.aspx其中指出:

隔离级别具有连接范围的范围,并且一旦设置为 与 SET TRANSACTION ISOLATION LEVEL 语句连接,它 保持有效,直到连接关闭或另一个隔离 级别已设定。当连接关闭并返回到池中时, 上次 SET TRANSACTION ISOLATION LEVEL 的隔离级别 声明被保留。后续连接重用池化的连接 连接使用当时有效的隔离级别 连接被池化。

问题是连接以可串行化隔离级别打开;关联的事务已被处理,连接也已被处理,但连接并未被销毁并进入连接池。下次当发出连接请求(使用相同的连接字符串)时,就会返回该连接,并且由于查询未指定任何隔离级别,因此它在可序列化隔离级别中执行。

基本上,如果您有一个连接池并在特定隔离级别(例如可序列化)中打开一个连接,那么该连接将返回到隔离级别设置为可序列化的池中。下次请求连接时,您无法确定不会返回该连接,因此即使默认隔离级别为 ReadCommissed,您也可能会获得这些“可序列化”连接之一。

另一个需要注意的是,每次将隔离级别设置为可序列化(或其他任何相关级别)时,您可能会选择不同的连接,并且慢慢地,您可能会通过将隔离级别设置为可序列化(或其他任何级别)来污染连接池中越来越多的连接。你设置)。

我没有找到任何机制来重置处置连接(当执行查询后返回到连接池时)。一种解决方法是显式重置每个连接的隔离级别。但这很乏味。

所以最好的选择是为不同的隔离级别创建单独的连接池.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 2008 R2(.Net 2.0 应用程序)中的死锁问题 的相关文章

随机推荐

  • 从构造函数初始化 Typescript 类值

    我使用 TypeScript 通过 KnockoutJS 创建一些类 并从 WebAPI 返回的一些 JSON 加载数据 问题是我想从构造函数将 JSON 值复制到我的 TypeScript 类中 但如果我仅在基类中执行此操作 则继承的属性
  • JSON.net 不包含 EmitDefaultValue false 的 null 属性

    我有一个包含许多数据合约的系统 其中成员装饰有 DataMember EmitDefaultValue false 我有一个情况 当序列化为 JSON 时 我需要在 null 时包含成员 无论我选择什么序列化器设置 我都无法使其工作 Tes
  • 在 GTK+3 中滚动 WebKit2.Webkit 窗口

    如何滚动webkit2gtk widget In webkitgtk aka webkit1 你包裹你的WebView in a ScrolledWindow 因此可以使用其vadjustment财产 For wekit2gtk 这个调用W
  • 将 CMS 与现有 ASP.NET 网站集成

    我正在尝试将 CMS 集成到使用 ASP NET 构建的现有网站中 aspx文件和 aspx cs文件背后的代码 未编译 我的研究表明 我的最佳候选者是 N2 CMS 我理想的方法是使用各种可编辑内容类型配置编辑器 并让我现有的页面和用户控
  • 如何正确使用 Django 中的“choices”字段选项

    我正在这里阅读教程 https docs djangoproject com en 1 5 ref models fields choices https docs djangoproject com en 1 5 ref models f
  • gpuDevice() 工具包版本始终为 5.5

    无论我如何重新安装CUDA驱动程序和工具包 当输入gpuDevice 时 它总是显示 CUDADevice with properties Name Quadro K2000M Index 1 ComputeCapability 3 0 S
  • 删除/清空的 Graphite Whisper 文件自动重新生成

    我试图删除一些旧的石墨测试耳语指标 但没有成功 我可以通过删除文件来删除指标 看 如何清理石墨耳语的数据 https stackoverflow com questions 9587161 how to cleanup the graphi
  • 如何使用 Gitlab 设置代码审查?

    如何使用 Gitlab 设置代码审查 我看到它在 Gitlab 网站上被列为一项功能 但我似乎找不到有关如何设置该功能的说明 就这一点而言 任何指向 Gitlab 用户手册的链接将不胜感激 我的一些搜索表明 合并请求 是可行的方法 但我发现
  • 从命令行启动 AVD 时卡在“撤销 Google 应用程序的麦克风权限”上

    我正在运行命令来启动 AVD 但是 当设备启动时 卡在这个错误上 撤销 Google 应用的麦克风权限 有什么线索吗 我正在使用 AVD 设备 API 28 运行这些命令时出现同样的错误 Users username Library And
  • 了解 WCF

    谁能给我指出一个用图片和简单代码片段解释 WCF 的资源 我厌倦了在所有搜索结果中进行谷歌搜索并找到相同的 ABC 文章 WCF 是一项非常复杂的技术 在我看来 它的文档记录非常少 它的启动和运行非常容易 但是运行大型应用程序的性能调整可能
  • 如何使用 dalli 和 Rails 将内存缓存板大小增加到 1MB 以上?

    我正在使用 Ruby on Rails 和 dalli gem 通过 memcache 进行缓存 默认值 键值存储中的值 又名slab 最大大小为1MB 我想将其增加到 2MB dalli 的文档 https stackoverflow c
  • 无法找到名为“entityManagerFactory”的 bean

    我的应用程序无法启动 它由 Spring Boot JPA SQLite 组成 但 Spring Boot 和 MySQL 运行良好 我不明白为什么会发生这种情况 错误是 无法找到名为 entityManagerFactory 的 bean
  • Stripe 在 Python 中不会抛出充电错误

    我正在使用 Python 中的 stripe 库进行信用卡收费 我使用 customerID 来收费 而不是使用令牌 因为我想重复使用该卡 而无需每次都询问 成功过程运行得很好 但是 如果我创建错误条件 则永远不会抛出 例外 我正在使用无效
  • Javascript document.cookie 总是返回空字符串

    我在客户端 javascript 设置 cookie 时遇到了这个真正奇怪的问题 我目前正在开发一个小型的 1 页演示 以使用 cookie 来存储一些 首选项 请注意 我无法在此演示中使用服务器端语言或任何第 3 方 jQuery 插件
  • 尝试使用 python 3 加载 JSON 对象时出错

    我有以下 json 对象 我试图用 python 3 解析 customerData Joe visits 1 Carol visits 2 Howard visits 3 Carrie visits 4 我使用以下 python 代码来解
  • 等待任务.Delay(foo);需要几秒而不是毫秒

    使用可变延迟Task Delay当与类似 IO 的操作结合时 随机花费几秒而不是几毫秒 重现代码 using System using System Collections Generic using System Diagnostics
  • React-js 忽略标签的 'for' 属性

    我知道对于 class 我们必须使用 className 但是我如何做出反应以保留 for 属性 下列
  • 在循环中定义匿名函数(包括循环变量)?

    我知道这段代码不起作用 我也知道为什么 但是 我不知道如何解决它 JavaScript var function id return document getElementById id document addEventListener
  • 如何从我的网站邀请 Facebook 的朋友 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • SQL Server 2008 R2(.Net 2.0 应用程序)中的死锁问题

    所讨论的 Sql Server 2008 R2 实例是一个重负载 OLTP 生产服务器 几天前出现了僵局问题 但仍未解决 我们收到了 Xml 死锁报告 其中列出了死锁涉及的存储过程以及其他一些详细信息 我将首先尝试列出此 xml 中的事实