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页出现死锁 的相关文章

  • 如何在使用存储过程插入数据表时获取范围标识列

    我正在使用存储过程插入数据表并之前创建了一个类型表 查询是我想取回已在此会话中插入的所有 ProdID 对于单个插入 我可以获取范围标识 但我想获取最近插入的所有内容 提前致谢 dbo sp Isert dt Product Product
  • 同时使用实体框架与 SQL Server 和 SQLite 数据库

    我有一个用于测试目的的 C Net 4 0 控制台应用程序 使用 VS 2012 我的目标是能够创建一个可在 MS SQL Server 数据库和 SQLite 数据库上使用的单个实体框架 edmx 文件 基本上 我想使用相同的实体模型类和
  • 从长到宽 - SQL [重复]

    这个问题在这里已经有答案了 我有一张很长的桌子 例如 Date Person Number 2015 01 03 A 4 2015 01 04 A 2 2015 01 05 A 3 2015 01 03 B 5 2015 01 04 B 6
  • Informatica:工作流映射引用的 odbc.ini 文件错误

    我正在尝试从 Informatica Workflow 中执行工作流映射 来源是MSSQL Server和目标Oracle DB 该映射与其他所有映射类似 似乎都指的是系统的 etc odbc ini文件而不是坐在里面的人 INFA HOM
  • 如何在SQL Server中创建SYS模式的表?

    可以在 SQL Server 2008 sys 架构中创建表吗 我知道可以将表标记为系统 但不能更改架构 有什么窍门吗 您无法将自己的对象添加到 sys 架构中 无法在 sys 架构中创建用户定义的对象 盖尔 埃里克森 MS SQL Ser
  • 使用具有外键的表将数据从 asp.net 页面插入到我的数据库中

    我是一名初学asp net程序员 我的项目是网上购物课程 我有一些问题 我有 4 个表 它们之间有一些外键 CREATE TABLE dbo orderdetails orderid INT NOT NULL classid INT NOT
  • 在ASP CLASSIC中使用SQL参数,对象定义不正确错误

    我试图使用参数保护我的 INSERT 语句免受 SQL 注入 但由于某种原因我收到错误 Parameter object is improperly defined Inconsistent or incomplete informatio
  • 在 SQLCMD 模式下格式化输出?

    有没有办法可以指定输出文件格式SQLCMD模式这样我就可以使用它读回来BULK INSERT 我想做这样的事情 CONNECT SERVER1 OUT E test SELECT TOP 100 ID NAME FROM DB1 dbo T
  • 一个存储过程创建的临时表可以在另一个存储过程中使用吗?

    我有一个存储过程 它使用找到的索引创建一个临时表CONTAINSTABLE就像 我放了一段存储过程代码 CREATE TABLE tmpTable ID INT RANK INT SELECT query SELECT DISTINCT I
  • Id 或 [TableName]Id 作为主键/实体标识符

    是否首选使用 Id 作为主键的列名或 TableName Id 作为命名约定 表 账户主键 ID 相对 表 账户主键 AccountId 在我见过的实现中 它似乎分为 50 50 左右 每种方法的优点和缺点是什么 跟进 在我的数据库中使用一
  • SQL SERVER 中的排序依据和大小写

    我需要在存储过程中按功能排序 一个值被发布到网络服务 并且基于该值我必须以某种方式对结果进行排序 即 当 ColName 按 ColName 发布订单时 当 ColName2 由 ColName2 发布订单时 我正在研究使用 Case 但出
  • SQL Server freetexttable 部分单词

    我第一次使用 SQL 自由文本搜索 我有点困惑为什么它会这样 我有一个联系人表 用户可以搜索并且我正在使用 SELECT Contacts Rank FROM FREETEXTTABLE Contacts O Roarty AS Conta
  • 如何授予所有表的 REFERENCES 权限

    我必须授予REFERENCES登录权限说sql login 我可以给予资助REFERENCES对单个表的权限 例如 GRANT REFERENCES ON Mytable TO sql login 有什么办法可以授予REFERENCES允许
  • 连接两个表的查询的 SQL Server“FOR XML”输出

    我是 SQL Server 中 FOR XML 功能的新手 我正在使用 SQL Server 2012 我有两个表 Word 和 Word Expansion 样本数据 表 字 WordOID Word 1 PIPE 2 WIRE 表 Wo
  • SQL Server 用分隔符分割字符串

    我有一个输入字符串 100 2 3 101 2 1 103 2 3 我想解析它并将其添加到具有 3 列的表中 因此它应该是 f x col1 col2 col3 100 2 3 类似的其他数据以逗号分隔作为记录和 作为列 Thanks ni
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

    几天来 我在使用 Glassfish EJB3 和 Mysql InnoDB 的 Java 应用程序上遇到了死锁问题 配置 Mysql InnoDB Ver 14 12 Distrib 5 0 51a 适用于 debian linux gn
  • Kerberos 双跳

    我们遇到了臭名昭著的 Kerberos 双跳问题 这是一个全新的域 是从以前使用模拟和委派的另一个提供商迁移而来的 我们已将操作系统升级到最新的 SQL 服务器 2017 WPF 应用程序 使用域凭据 gt Web 服务 IIS 10 上的
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql

随机推荐

  • 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