SqlServer 2005:没有共享记录的死锁问题

2023-12-20

我遇到两个不访问任何公共记录的事务的死锁问题。也没有锁升级。所以我无法解释为什么可能出现僵局。

当两个这样的事务同时执行时就会发生死锁:

begin transaction

update A set [value] = [value]
where id = 1; /* resp. 2 */

/* synchronize transactions here */

SELECT * 
FROM  
 A inner join B on A.B_FK = B.id
 inner join C on C.A_FK = A.id
WHERE 
 A.[value] = 1; /* resp. 2 */

rollback;

这些是用于设置场景的表格和数据:

CREATE TABLE A (
  id INT NOT NULL,
  [value] INT,
  B_FK INT
  primary key (id)
)

CREATE TABLE B (
  id INT NOT NULL,
  primary key (id)
)

CREATE TABLE C (
  id INT NOT NULL,
  A_FK INT
  primary key (id)
)

INSERT INTO A VALUES(1, 1, 1) 
INSERT INTO B VALUES(1) 
INSERT INTO C VALUES(1, 1) 

INSERT INTO A VALUES(2, 2, 2) 
INSERT INTO B VALUES(2) 
INSERT INTO C VALUES(2, 2) 

Table A位于三张桌子的中间。如果我更改查询中的任何内容,例如删除其中一个连接表B or C,不存在僵局。当我过滤时也是如此A.id代替A.value.

死锁图告诉我他们都想给表的主键索引设置一个S锁A。再次强调:不存在锁升级。

我正在使用 SqlServer 2005。

  • 为什么这些事务在没有访问任何公共数据的情况下会发生冲突?谁能解释一下吗?
  • 我可以做什么来避免它?我正在使用 NHibernate,无法轻松更改查询。
  • 会不会是SqlServer的问题?

多谢。


这种冲突可能会发生,因为 SQL-Server 不仅在行级别上锁定,而且还在页甚至表级别上锁定。

这意味着即使记录本身并未实际使用,而只是“附近”的不同记录,也可以锁定该记录。

SQL Server 锁争用已被驯服 http://www.sql-server-performance.com/2000/lock-contention-nolock-rowlock/可能会有帮助

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

SqlServer 2005:没有共享记录的死锁问题 的相关文章

随机推荐

  • 在 g++ 上进行聚合初始化的 std::array 会生成大量代码

    在 g 4 9 2 和 5 3 1 上 此代码需要几秒钟的时间来编译并生成 52 776 字节的可执行文件 include
  • 无法在样式中的目标标记上指定事件“LostFocus”。使用 EventSetter 代替

    为什么我会收到此错误消息 我正在使用事件设置器 edit 我没有使用内联样式 它位于资源中 即
  • 调整facet_grid中一条线的线型

    我有一个与此类似的情节 b lt data frame x c 1 2 3 1 2 3 1 2 3 1 2 3 y c 1 2 3 1 5 1 9 2 5 3 2 1 2 9 1 8 1 5 c c 1 1 1 2 2 2 1 1 1 2
  • JavaScript - 预加载图像

    我正在开发一个照片库 我希望能够在加载主图像之前显示 gif 预加载器 然后显示主图像 所以 这就是我得到的 我有一个 photo place这是保存主照片的 div 这会根据用户选择的缩略图而变化 当用户选择缩略图时 会触发此函数 fun
  • Entity Framework Core 忽略 .Include(..) 而不间接忽略 .ToList(..)

    如前所述在 EF Core 文档的 加载相关数据 中 https learn microsoft com en us ef core querying related data我们可以用 Include 立即加载导航属性DbSet 或通用I
  • 无需预处理即可通过子例程实现打印语句的强大功能?

    由于 Fortran 子例程需要声明所有内容 因此我们无法轻松编写具有与print陈述 在整个代码中 我们有 print 语句 每个语句都有多个 if 语句来处理并行处理和所选的调试输出模式 打印许多不同类型 不同格式的变量 包括带有各自
  • Hibernate 和 JPA 错误:依赖 Maven 项目上的重复导入

    我有两个 Maven 项目 一个名为项目数据另一个打电话项目休息这依赖于项目数据项目 Maven 构建成功项目数据项目但失败了项目休息项目 但以下情况除外 Caused by org hibernate DuplicateMappingEx
  • 最小化 SQLite 库大小

    我认为这对于 sqlite3 dll 或 sqlite3 lib 是相同的 但如果不是 我对 sqlite3 o mingw32 感兴趣 如何最小化库的大小 使用 O3 因为速度是我最关心的问题 所以不同的编译器优化不是一个选项 如果我知道
  • 从解析查询块返回 UIImage 数组

    我无法从此函数获得 UIImage 返回 这getDataInBackgroundWithBlock不允许我设置除Void in 然而 该块确实增加了iconArray当它迭代时 但是一旦超出该块 数组又会变空 您将在下面的代码中看到数组正
  • Firebase 动态链接在 iOS 上不起作用

    我正在制作一些应用程序并使用 firebase 动态链接 当我在我的 Android 手机上测试动态链接时 效果很好 在我的iOS中 它也可以工作 但是页面没有改变并且任何参数都没有传递 当我在 safari 上输入如下图所示的深度链接时
  • 如何使用谷歌地图V2通过触摸来在地图片段上绘制形状

    大家好 我正在使用 Google 地图 V2 我必须通过触摸在地图片段上绘制一个形状 也就是说 如果我在地图上旋转手指 就会生成一个形状 我遇到问题 因为当我们触摸时 Google mapV2 不提供纬度和经度 地图 我不需要单击 MapV
  • 限制mongodb集合中的文档数量

    我有一个用作缓存的集合 如何将这个集合中的文档数量限制为 5M 注意 可以更新的缓存项将存在于缓存中 我尝试使用 capped 但保存在 capped 集合中的项目无法修改 有没有办法做到这一点 我想避免删除该项目然后插入更新项目 不幸的是
  • “调试器无法继续运行该进程。”

    我一直在搞乱 VS 2010 调试设置 试图进入 NET Framework 工作 好吧 我无法让它工作 我还尝试过 Reflector VS 插件 并且一度可以正常工作 然后我随机开始收到此错误 This only当我在调用的行上有断点时
  • PHP 在 fclose 后无法取消链接文件

    我的脚本完成后 我可以删除该文件 但在它运行时我无法触及它 即使在fclose 这是我尝试使用的代码 Files glob SERVER DOCUMENT ROOT files csv File fopen Files 0 r while
  • 获取变量“@xml_files”不会在...行保持共享

    我有以下 Perl 代码 sub merge xml foreach my repository repo1 repo2 my xml files sub match xml my filename File Find dir if fil
  • jQuery,悬停时图像变化[重复]

    这个问题在这里已经有答案了 好的 我已经通过 PHP 动态生成了图像 因此结果不一定相同 在过去的四个小时里 我浏览了互联网并使用 jQuery 和 或 CSS 尝试了无数的事情 并且我想出了以下可行的方法 a href build php
  • 如何使用 Ninject 注入一些通用的 asp.net http 处理程序?

    我是 Ninject 的新手 我不知道如何注入我的通用 http 处理程序 我有一个 MVC3 项目 我将我的服务注入到控制器中 没有任何问题 这是我在 Ninject App start 类中用于注册服务的内容 private stati
  • 以编程邮件合并方式将数据注入到现有的 Excel 电子表格中?

    我想自动将数据输入到 Excel 电子表格中 用户数据将存在于网站上 当用户请求时 需要将该数据注入到 Excel 电子表格中 复杂之处在于 Excel 电子表格的格式在不同用户之间可能存在很大差异 它将由用户定义 我一直认为这是一个模板问
  • 如何让 IDropTarget 与 Delphi 中的 Drop Handler 配合使用?

    我已将文件扩展名与我的 Delphi 2009 程序相关联 我一直在使用命令行调用方法将文件名传递给我的 Delphi 程序 以便可以打开它 但是 我发现当选择多个文件并一次单击所有文件时 它会在程序的单独实例中打开每个文件 我问过这个 h
  • SqlServer 2005:没有共享记录的死锁问题

    我遇到两个不访问任何公共记录的事务的死锁问题 也没有锁升级 所以我无法解释为什么可能出现僵局 当两个这样的事务同时执行时就会发生死锁 begin transaction update A set value value where id 1