2页出现死锁

2024-02-07

我正在解决在生产环境中看到的一些死锁,我对此很陌生,但有些事情对我来说似乎很奇怪。所以我有下面的死锁图:

死锁的右侧是更新,如下所示:

UPDATE order_sub_line SET sub_line_status = 300 WHERE order_sub_line_id = '75C387EC-A1A7-4587-9FA0-DD33A49009BC'

在我看来,该更新正在尝试获取 2 个页面锁。 order_sub_line_id 是聚集索引。

这是否应该尝试获取 2 个页面锁,如果是的话为什么?

附加信息:

死锁受害者是一个视图(连接了一些其他表,包括 order_sub_line),它本质上是在此表上运行以下查询:

select top(50) * from order_sub_line osl where osl.sub_line_type = 1 and osl.sub_line_status < 375

除了 order_sub_line.order_sub_line_id 上的聚集主键索引外,order_sub_line 上没有任何索引

Execution plan: enter image description here

死锁 XML:

<deadlock-list>
 <deadlock victim="process4224eccf8">
  <process-list>
   <process id="process4224eccf8" taskpriority="0" logused="0" waitresource="PAGE: 7:1:13448 " waittime="1628" ownerId="1683307923" transactionname="SELECT" lasttranstarted="2013-07-31T08:45:53.157" XDES="0x48afafc40" lockMode="S" schedulerid="2" kpid="1208" status="suspended" spid="151" sbid="0" ecid="15" priority="0" trancount="0" lastbatchstarted="2013-07-31T08:45:53.157" lastbatchcompleted="2013-07-31T08:45:53.157" lastattention="1900-01-01T00:00:00.157" clientapp="ExactaAOR" hostname="BASTIAN-PC" hostpid="7336" isolationlevel="read committed (2)" xactid="1683307923" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" stmtstart="72" sqlhandle="0x0200000055b04f0c4d136173c4d51458bdb5002bfe5801370000000000000000000000000000000000000000">
SELECT TOP (@p0)  this_.TRANSPORT_CNTNR_ID as TRANSPORT1_9_0_, this_.CNTNR_NAME as CNTNR2_9_0_, this_.CNTNR_TYPE as CNTNR3_9_0_, this_.CNTNR_HEIGHT as CNTNR4_9_0_, this_.CNTNR_WIDTH as CNTNR5_9_0_, this_.CNTNR_DEPTH as CNTNR6_9_0_, this_.CNTNR_WEIGHT as CNTNR7_9_0_, this_.PARENT_CNTNR_ID as PARENT8_9_0_, this_.RESERVATION_LOC_ID as RESERVAT9_9_0_, this_.WORK_AREA_ID as WORK10_9_0_, this_.WORK_AREA_NAME as WORK11_9_0_, this_.GROUP_ID as GROUP12_9_0_, this_.RELEASE_STATUS as RELEASE13_9_0_, this_.RELEASE_TIME as RELEASE14_9_0_, this_.PRINT_STATUS as PRINT15_9_0_, this_.SUB_LINE_COUNT as SUB16_9_0_, this_.ORDER_ID as ORDER17_9_0_, this_.QTY_REQUESTED as QTY18_9_0_, this_.ORDER_NAME as ORDER19_9_0_, this_.ORDER_PRIORITY as ORDER20_9_0_, this_.ORDER_STATUS as ORDER21_9_0_, this_.ON_HOLD as ON22_9_0_, this_.DUE_DATE as DUE23_9_0_, this_.ORDER_SUB_LINE_STATUS as ORDER24_9_0_ FROM V_CARTON_RELEASE this_ WHERE (this_.RELEASE_STATUS = @p1 and this_.ORDER_SUB_LINE_STATUS &lt; @p2) ORDER BY this_.RELEASE_TIME asc     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@p0 int,@p1 nvarchar(4000),@p2 int)SELECT TOP (@p0)  this_.TRANSPORT_CNTNR_ID as TRANSPORT1_9_0_, this_.CNTNR_NAME as CNTNR2_9_0_, this_.CNTNR_TYPE as CNTNR3_9_0_, this_.CNTNR_HEIGHT as CNTNR4_9_0_, this_.CNTNR_WIDTH as CNTNR5_9_0_, this_.CNTNR_DEPTH as CNTNR6_9_0_, this_.CNTNR_WEIGHT as CNTNR7_9_0_, this_.PARENT_CNTNR_ID as PARENT8_9_0_, this_.RESERVATION_LOC_ID as RESERVAT9_9_0_, this_.WORK_AREA_ID as WORK10_9_0_, this_.WORK_AREA_NAME as WORK11_9_0_, this_.GROUP_ID as GROUP12_9_0_, this_.RELEASE_STATUS as RELEASE13_9_0_, this_.RELEASE_TIME as RELEASE14_9_0_, this_.PRINT_STATUS as PRINT15_9_0_, this_.SUB_LINE_COUNT as SUB16_9_0_, this_.ORDER_ID as ORDER17_9_0_, this_.QTY_REQUESTED as QTY18_9_0_, this_.ORDER_NAME as ORDER19_9_0_, this_.ORDER_PRIORITY as ORDER20_9_0_, this_.ORDER_STATUS as ORDER21_9_0_, this_.ON_HOLD as ON22_9_0_, this_.DUE_DATE as DUE23_9_0_, this_.ORDER_SUB_LINE_STATUS as ORDER24_9_0_ FROM V_CARTON_RELEASE this_ WHERE (this_.RELEASE_STATUS = @p1 and this_.ORDER_SUB_LINE_STATUS &lt; @p2) ORDER    </inputbuf>
   </process>
   <process id="process4bf7bdc38" taskpriority="0" logused="8608" waitresource="PAGE: 7:1:13447 " waittime="1616" ownerId="1683308190" transactionname="user_transaction" lasttranstarted="2013-07-31T08:45:53.450" XDES="0x4ebd456a8" lockMode="IX" schedulerid="1" kpid="6032" status="suspended" spid="85" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-07-31T08:45:53.450" lastbatchcompleted="2013-07-31T08:45:53.450" lastattention="1900-01-01T00:00:00.450" clientapp="ExactaAOR" hostname="BASTIAN-PC" hostpid="7336" loginname="asapdb" isolationlevel="read committed (2)" xactid="1683308190" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" stmtstart="60" sqlhandle="0x02000000109639184c42e35fa55701e017640d83bd4818c30000000000000000000000000000000000000000">
UPDATE ORDER_SUB_LINE SET SUB_LINE_STATUS = @p0 WHERE ORDER_SUB_LINE_ID = @p1     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@p0 int,@p1 uniqueidentifier)UPDATE ORDER_SUB_LINE SET SUB_LINE_STATUS = @p0 WHERE ORDER_SUB_LINE_ID = @p1    </inputbuf>
   </process>
  </process-list>
  <resource-list>
   <pagelock fileid="1" pageid="13448" dbid="7" subresource="FULL" objectname="Exactadb.dbo.order_sub_line" id="lock4cf017000" mode="IX" associatedObjectId="72057594460962816">
    <owner-list>
     <owner id="process4bf7bdc38" mode="IX"/>
    </owner-list>
    <waiter-list>
     <waiter id="process4224eccf8" mode="S" requestType="wait"/>
    </waiter-list>
   </pagelock>
   <pagelock fileid="1" pageid="13447" dbid="7" subresource="FULL" objectname="Exactadb.dbo.order_sub_line" id="lock4a4554500" mode="S" associatedObjectId="72057594460962816">
    <owner-list>
     <owner id="process4224eccf8" mode="S"/>
    </owner-list>
    <waiter-list>
     <waiter id="process4bf7bdc38" mode="IX" requestType="wait"/>
    </waiter-list>
   </pagelock>
  </resource-list>
 </deadlock>
</deadlock-list>

根据所提供的数据得出以下推论,

  1. 这两个事务都在读已提交隔离级别下运行。
  2. 一个事务正在执行多个单独的行更新。从其中一个进程持有 IX 锁并等待另一个进程这一事实可以明显看出这一点。根据执行计划,UPDATE 语句使用单行聚集索引查找。因此它将获取 KEY 级别的 X 锁和页级别的 IX 锁。
  3. SELECT 语句正在获取页级别粒度的锁。此外,SELECT 在读取页面后保留锁定。正常情况下,在 READ COMMITTED ISOLATION LEVEL 下,SELECT 语句将在读取后立即获取和释放 SHARED 锁。

通过这些发现,我几乎可以肯定,死锁的发生是由于涉及称为 UNORDERED PREFETCH 的查询优化的特殊场景造成的。这是我所知道的唯一场景,其中在 READ COMMITTED 隔离级别下运行的 SELECT 语句保留共享锁直到语句结束。

可以在以下位置找到此类死锁的重现和可能的解决方案:https://web.archive.org/web/20120806214319/http://sqlindian.com/2012/07/13/deadlock-on-select-due-to-unordered-prefetch/ https://web.archive.org/web/20120806214319/http://sqlindian.com/2012/07/13/deadlock-on-select-due-to-unordered-prefetch/

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

2页出现死锁 的相关文章

  • 当从属文本框中没有输入文本时,如何让 gridview 显示所有表格行?

    下面的代码可以正常工作 并根据文本框中输入的文本过滤我的网格视图 当我的文本框中没有输入任何文本时 我没有得到任何结果 并且无法理解为什么 我的问题 如何让gridview显示all当文本框中没有输入文本时表行 MSSQL Search n
  • 获取在任何日期创建的表的列表?

    我遇到了这样的情况 我想查找我在 2012 年 9 月 14 日 2012 年 9 月 14 日 在 sql server 上创建的表 是否有任何查询会列出在此日期创建的这些表 SELECT FROM sys tables WHERE cr
  • SQL Server 中高效的字符串后缀搜索?

    我想找到与谓词匹配的所有行MyColumn LIKE FooBar 但通过使用索引查找而不是扫描 一种方法本质上是创建 MyColumn 的反向版本并搜索反向模式 ooF 在该列上 在反向列上有一个常规索引 然而 我不喜欢手动创建这个反向列
  • SQL Server:为什么 ISO-8601 格式的日期依赖于语言?

    我需要一些帮助来理解 SQL Server 中的日期格式处理 如果您尝试以下操作 它将返回正确的结果 SET LANGUAGE English SELECT CAST 2013 08 15 AS DATETIME 2013 08 15 00
  • Entity Framework 6(代码优先)实体版本控制和审计

    我正在考虑将 Entity Framework 6 1 1 与 SQL Server 2008 R2 一起使用 目前 我正在使用代码优先的 EF 功能创建模型和数据库 我的基本用例是创建一个特定实体的所有更改的日志 ID是关键栏 以帮助审核
  • 使用存储过程中的 Select 查询将单个变量分配给多行

    我的查询是使用 Select 将单个变量分配给多行 存储过程中的查询 例如 我从 Employee 表中获取 10 个 比如 1 到 10 个员工 ID 声明 id int select id EmpId from Employee sel
  • std::lock 仍然导致死锁

    std lock 是用来防止死锁的 对吗 但在我的测试中 它仍然导致死锁 你能检查一下我的测试代码 看看我是否使用了错误的代码吗 std mutex m1 std mutex m2 void func1 std unique lock
  • SQL Server 查询中 UNION ALL 与 OR 条件

    我必须根据表上不存在的条件选择一些行 如果我使用如下的 union all 它会在不到 1 秒的时间内执行 SELECT 1 FROM dummyTable WHERE NOT EXISTS SELECT 1 FROM TABLE t WH
  • 告诉我 SQL Server 全文搜索器疯了,不是我疯了

    我有一些客户具有用户正在搜索的特定地址 123 通用方式 数据库中有 5 行匹配 ResidentialAddress1 123 GENERIC WAY 123 GENERIC WAY 123 GENERIC WAY 123 GENERIC
  • 如何向 SQL 连接字符串添加自定义属性?

    我想在 SqlServer 连接字符串中添加一些自定义属性 如下所示 Integrated Security SSPI Extended Properties SomeAttr SomeValue Persist Security Info
  • Oracle OLE DB 提供程序未在 SSIS 中列出

    我在 SSIS 和 VS2015 CM 方面遇到问题 我有一个包需要连接 Oracle 来获取一些数据 我安装了适用于 Win64 的 ODAC 和 Oracle 客户端 但看不到提供程序列表中列出的 OLE DB 的 Oracle 提供程
  • SQL-Server:备份集保存现有数据库以外的数据库的备份

    我正在尝试恢复数据库的 SQL Server 备份文件 但它抛出如下错误 备份集保存除现有数据库之外的数据库的备份 我的数据库是SQL Server 2008 备份文件是2005年的 可能是什么问题 我也遇到过这个问题 解决方案 不要创建空
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • 重用 t-sql 游标的起始位置?

    我正在开发一个在临时表上使用游标的存储过程 我已经阅读了一些关于为什么不需要游标的内容 但在这种情况下我相信我仍然需要使用游标 在我的过程中 我需要遍历表的行两次 声明游标后 已经单步执行临时表并关闭游标 重新打开时游标的位置是否仍保留在表
  • ADO.NET SQLServer:如何防止关闭的连接持有S-DB锁?

    i Dispose http msdn microsoft com en us library system data sqlclient sqlconnection close aspx一个 SqlConnection 对象 但是当然它并
  • 如何将 SQL Server 中同一表中的一列插入到另一列中

    我需要将一列的数据插入到同一个表中的另一列中 谁能告诉我这个怎么写 Thanks UPDATE table SET col 2 col 1
  • 仅选择 Varchar 列中的数字[重复]

    这个问题在这里已经有答案了 在 SQL Server 2008 R2 中 我在 varchar 12 列中有一些数据 它看起来像这样 Data 1234 1765 34566 123 SDRMH HJG434 我想从所有包含 的行中删除 并
  • SQL Server:当列为 NTEXT 时 IN('asd') 不起作用

    我该如何解决这个问题 where someNtext IN asd asd1 给出错误 消息 402 第 16 层 状态 1 第 XXXXX 行数据类型 ntext 和 varchar 在等于运算符中不兼容 An INlist 只是 OR
  • 为什么这段代码会死锁?

    我在可加载模块中创建了 2 个 Linux 内核线程 并将它们绑定到在双核 Android 设备上运行的单独 CPU 内核 运行几次后 我注意到设备重新启动并重置了硬件看门狗定时器 我一直在解决这个问题 什么可能导致僵局 基本上 我需要做的
  • SQL Server默认字符编码

    默认情况下 Microsoft SQL Server 中数据库的字符编码集是什么 如何查看 SQL Server 中当前的字符编码 编码 In most cases SQL Server stores Unicode data i e th

随机推荐

  • C#中如何使用“using”捕获异常

    鉴于此代码 using var conn new SqlConnection conn Open using var cmd conn CreateCommand cmd CommandText using var reader cmd E
  • 为什么进程在 4GB 时被杀死?

    我编写了一个可以处理大量数据的程序 我的 CPU 和操作系统 Ubuntu 都是 64 位的 并且我有 4GB 的 RAM 使用 top Mem 字段 我看到该进程的内存消耗上升到 87 左右 即 3 4 GB 然后它被杀死 然后我使用 u
  • JSF h:inputText 验证和 f:ajax 渲染

    一个非常简单的 JSF 应用程序 InputText 元素分配有 Validator f ajax 用于渲染下一个元素 phoneNumber 方法是使用blur event 仅当 inputText 通过验证器且 isValid 布尔值设
  • 如何使用 Visual Studio x64 进行编译?

    我想从bat 文件在VS2008 x64 中编译 当我在 VS2008 32 位中编译时 我调用 vsvars32 bat 我需要调用什么才能在 x64 中进行编译 现在建议不要使用vsvar32 bat并使用SetEnv cmd而是设置您
  • 发现长模式

    给定一个排序的数字列表 我想找到最长的子序列 其中连续元素之间的差异呈几何级数增加 所以如果列表是 1 2 3 4 7 15 27 30 31 81 那么子序列是1 3 7 15 31 或者考虑1 2 5 6 11 15 23 41 47其
  • 检查 Javascript 数组值是否按升序排列

    假设我有一个 Javascript 整数数组 我想检查它的所有值是否都按升序排列 我想要的是将数组键保存在另一个数组中 以防算法发现一个较低 或等于 的值 不仅比较前一个值 而且还比较它之前的任何值 我所做的是这样的 arr nonvali
  • 匹配大文本文件中的字符串?

    我有一个字符串列表 其中包含大约 700 万个项目 大小为 152MB 的文本文件 我想知道实现 a 函数的最佳方法是什么 该函数接受单个字符串并返回它是否在该字符串列表中 您是否需要多次匹配此文本文件 如果是这样 我会创建一个HashSe
  • 日期格式 dd\mm\yyyy 的正则表达式是什么?

    日期格式 dd mm yyyy 的正则表达式是什么 我无法找到这种格式的正则表达式 模式 dd mm yyyy 的正则表达式 String regex 0 2 0 9 3 0 1 0 0 9 1 0 2 0 9 0 9 0 9 0 9
  • 在 Objective-C 中设置文件权限

    我设法得到了一个漂亮的 ftp 对象 它的级别非常低并且很容易适应 我使用它通过 FTP 将文件从一台 Mac 传输到另一台 Mac 现在 我遇到的问题是 当传输的文件到达目的地 另一台 Mac 时 访问权限会以随机间隔设置为 所有人 无访
  • 不可变集合上的非可变“添加”方法的最佳名称是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动
  • “‘字段列表’中的未知列”,但列确实存在

    DROP TABLE IF EXISTS transactions CREATE TABLE transactions id int 11 unsigned NOT NULL AUTO INCREMENT purchase date dat
  • 使用 php 获取下一个 15 日和/或 30 日的日期?

    我需要获取即将到来的日期15th and 30ths未来几个月的日期 如果二月在范围内 当然必须是 28 29 我可以使用 mktime strtotime 或者使用其他方法来执行此操作吗 我得到了这个 但当然这只是为了得到这个月和下个月的
  • 允许保存比较标记的差异工具

    是否有一个 diff 工具可以保存比较标记 为了澄清这一点 我想保存两个文件的实际比较 以显示差异 然后发送给某人进行审查 EDIT 这里有很多好的答案 就我而言 我已经有一份副本无可比拟 http scootersoftware com但
  • Promise.then 作业执行顺序

    规范说 https www ecma international org ecma 262 7 0 index html sec jobs and job queues 第 5 段 来自单个作业队列的 PendingJob 记录始终在 先进
  • html 脚本 src="" 用按钮触发重定向

    我有以下用于登录的 login html 页面位于设计文件夹中 h3 Login h3
  • std::copy 和 std::vector 问题

    我明白为什么这会导致段错误 include
  • 保护 Linux Web 服务器的公共访问

    我想设置一个便宜的 Linux 机器作为 Web 服务器来托管各种 Web 技术 我想到了 PHP 和 Java EE 但我将来也想尝试使用 Ruby 或 Python 我相当精通设置 Tomcat 在 Linux 上运行以提供 Java
  • UILineBreakMode 与 NSLineBreakMode

    我看到一些 UIStringDrawing 方法已更新为使用 NSLineBreakMode 而不是 iOS 6 0 中的 UILineBreakMode E g CGSize sizeWithFont UIFont font constr
  • 原型继承最佳实践?

    我刚刚接触 JavaScript 并试图了解原型继承 似乎有多种方法可以达到相同的效果 所以我想看看是否有任何最佳实践或理由以一种方式做事而不是另一种方式 这就是我要说的 Method 1 function Rabbit this name
  • 2页出现死锁

    我正在解决在生产环境中看到的一些死锁 我对此很陌生 但有些事情对我来说似乎很奇怪 所以我有下面的死锁图 死锁的右侧是更新 如下所示 UPDATE order sub line SET sub line status 300 WHERE or