如何在 nhibernate 中复制和重试死锁

2023-11-27

查看我的日志,我可以看到我的应用程序很容易出现死锁。它们出现在我的应用程序的许多部分。

1)有没有办法复制这个问题。即:我只在日志中看到过这一点。

2)如果事务被锁定,重试的最佳/最简单方法是什么

3)如果我将调用包装在 try/catch 中。异常类型是什么。

关于这个问题有很多文章。我的结论是,最好的选择是尝试尽可能缩短交易时间。我应该更改隔离级别吗?


寻找死锁

僵局很难发现。如果您知道它们发生的原因,您可以在集成测试中重现它。在真实环境中,您可以使用Profiler来观察死锁。它显示了一个图表,显示死锁是如何形成的。

Retry

你实际上应该放弃交易并重新开始。任何数据库异常后,NHibernate 会话都会不同步。

我们在重新启动之前有一个延迟,以避免对数据库造成更大的压力。它等待包含随机数的特定时间,以避免并行事务再次同步。

避免死锁

减少锁定时间

如果您使用 Sql Server,由于其悲观锁定机制(与 Oracle 数据库相反),它非常容易受到死锁的影响。较新的 Snapshot 隔离级别与 Oracle 正在做的类似,可能会在一定程度上解决问题,但我直到现在才使用过,所以我不能说太多。

NHibernate 通过缓存对持久数据的更改并将其存储在事务结束时尽可能地解决了这个问题。但有一些限制和一些打破它的方法。

使用身份(“自动编号”)作为主键可能是最著名的错误。当将实体放入会话中时,它会强制 NH 插入实体,从而产生整个表的锁(在 SQL Server 中)。

解决起来更复杂的是冲洗问题。 NH需要在执行查询之前刷新更改,以确保一致性。您可以通过设置来解决这个问题FlushMode to Never,这可能会导致一致性问题,因此只有在您确切知道自己在做什么时才这样做。最好的解决方案是仅使用Get or Load或者导航到根实体的属性,而不是在事务中间执行查询。

通过执行所有这些操作,NH 能够等待对数据库的任何插入、更新和删除命令,直到事务结束。这大大减少了锁定时间,因此也降低了死锁的风险。

避免死锁的一般规则

使用 NHibernate 时,避免死锁的一般规则也适用。最重要的是:按一定的顺序锁定资源,不是一个一个地锁定资源,而是从一开始就全部锁定。后者与我上面所说的减少锁定时间是矛盾的。这意味着您在事务开始时锁定资源,以使其他事务等待直到该事务完成。这可能会减少死锁,但也会减少并行执行。

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

如何在 nhibernate 中复制和重试死锁 的相关文章

  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 使用按位运算符时的 HQL 到 CriteriaQuery

    如何将其转换为 CriteraQuery select n from TagRegistration t join t Tag n where t Status status gt 0 order by count t ID desc n
  • 如何判断一个引用的对象是否可以删除?

    我有一个名为 Customer 的对象 它将在其他表中用作外键 问题是我想知道是否可以删除 客户 即 它没有在任何其他表中引用 Nhibernate 可以做到这一点吗 你所要求的是找到的存在CustomerPK值在引用表FK列中 有很多方法
  • nhibernate:读写字符串列表

    我知道我可以使用 nhibernate 读取写入字符串列表 如下所示 HasMany x gt x Attachments KeyColumn RowId Table PostTable Element PostKey 但这会创建一个额外的
  • 为什么这段代码会死锁?

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

    我有一个使用 NHibernate 的 MVC3 应用程序 一切都很顺利 直到我开始尝试添加二级缓存 浏览网页几个小时后 我终于找到了我认为正确的 dll NHibernate Caches SysCache2 dll 并将其添加到我的项目
  • 对 id 属性使用自定义类型

    我有以下课程 public class UserId public UserId int id some validation public override string ToString public class User public
  • 是一对一的关系不好的策略

    用户始终拥有一个钱包 一个钱包始终属于一位用户 由于我想分离与钱夹相关的属性 我创建了 Wallet 对象并能够跟踪钱交易 我创建了 public Wallet Entity
  • 如何将 NHibernate 与 Lucene.Net 集成

    这变得很烦人 尝试将 Lucene Net 搜索与 NHibernate 集成 我只找到了 07 年的一些信息 有没有好看的最新这个的教程 从哪里开始 下载什么等 有没有办法在其他地方设置 NHibernate Search 元数据 而不是
  • 在 nhibernate 标准中使用内置的 sql“转换”函数

    我想利用 SQL Server 2008 中的 Convert 函数 以便可以在 DateTime 列上进行搜索 建议的 SQL 看起来像这样 SELECT list of fields FROM aTable WHERE CONVERT
  • 一次调用多个结果

    分页数据时 我不仅想返回10条结果 还想获取所有页面中的项目总数 如何在一次调用中获取页面的总计数和结果 我的分页方法是 公共IList GetByCategoryId intcategoryId intfirstResult intmax
  • 在nhibernate中设置聚集索引

    我试图在 nhibernate 中定义一个不是 id 的属性作为聚集索引 但我发现没有办法做到这一点 谁能给我指点一下这是如何完成的 或者它是当前在 nhibernate 中不可用的东西 提前致谢 您可以使用
  • Breeze + NHibernate 多对一关系,避免指定关系键

    以下多对一映射正在运行 取自 NorthBreeze public partial class UserRole public virtual long ID get set public virtual long UserId get s
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • Haskell:处理死锁的自引用列表

    GHC 允许永久阻止以下内容是否有任何有用的理由 list 1 tail list 看起来列表迭代器 生成器有点复杂 我们应该能够做一些更有用的事情 Return error Infinitely blocking list Return
  • NHibernate QueryOver SQLFunction in where 子句

    我想查询一个具有多行的表 每行都有一个timestamp数据每隔十分钟出现一次 我想找到任何丢失数据的开头 即没有timestamp等于接下来的十分钟间隔 如下所示 select a timestamp from table as a wh
  • 如何在 Nhibernate 中进行版本控制?

    我不敢相信让别人向我展示一个简单的工作示例是如此困难 这让我相信每个人都只能说得好像他们知道如何去做 但实际上他们并不知道 我将帖子缩短为仅我想要示例执行的操作 也许帖子太长了 吓跑了人们 为了获得这个赏金 我正在寻找一个可以在 VS 20
  • NHibernate双向一对一映射问题

    当尝试在 NHibernate 中创建双向一对一映射时 我发现我无法递归地获得对象的引用 例如 假设我之间有一对一的关系Person and Address 然后执行以下代码后 class Person public Address Add
  • MoveWindow死锁?

    我在线程 A 上有一个窗口 它在某个时刻 由于在其 wndproc 上收到消息 触发线程 B 上的操作 然后等待该操作完成 使用某种同步机制 然后线程B调用MoveWindow 在线程 A 的窗口 例如标准文本框 内移动子窗口 此时程序由于
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

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

随机推荐

  • 如何在 Scala 中对可变长度的重复序列进行分组

    我有一个以某种模式重复的整数集合 val repeatingSequence List 1 2 3 1 2 3 4 1 2 1 2 3 4 5 当模式重复时 我想将该列表分段 在这种情况下 当序列返回到 1 时 val groupedByS
  • 使用 Kubernetes kubeadm 和 minikube 在虚拟机中创建节点

    我正在尝试使用同一台机器创建具有不同数量节点的 Kubernetes 集群 在这里 我想创建单独的虚拟机 并需要在这些虚拟机中创建节点 我目前正在探索 kubeadm 和 minikube 来完成这些任务 在探索的过程中 我有以下困惑 我需
  • 如何将一个元素移动到另一个元素中

    我想将一个 DIV 元素移动到另一个 DIV 元素中 例如 我想移动这个 包括所有孩子 div div 进入这个 div div 这样我就有了这个 div div div div 您可能想使用appendTo函数 添加到元素的末尾 sour
  • Express Node.js 不起作用

    我在 ubuntu 12 04 上安装了express 4以及node js npm和express generator 并使用以下命令创建了一个应用程序 express test hogan c less cd test npm inst
  • SearchBuf soWholeWord 意外输出

    测试时StrUtils SearchBuf with soWholeWord soDown 选项 出现了一些意想不到的结果 program Project1 Uses SysUtils StrUtils function WordFound
  • Azure Functions:绑定到 DocumentClient 与静态实例 - 推荐什么?

    我知道如何将查询直接绑定到 Azure 函数并在函数中使用 Cosmos DB 触发器 但是 我正在寻找使用方向DocumentClient 努吉特包Microsoft Azure Cosmos 直接地 There s 文档这解释了如何在执
  • 实现“show”函数

    我想实施show 二元 函数的方法并使其能够区分内函子 a gt a 类似于伪 Haskell 代码 instance Show a gt b where show fun lt
  • jquery:如何更新可拖动克隆ID?

    我想将可拖动项目添加到可排序列表中 这在我的示例中运行良好http jsbin com ipese5 35 问题是我想在拖动到可排序列表时更新克隆项目的 id 奇怪的是 下面的代码将 de ui 对象中的 id 更新为 new id 正如我
  • 将 RTF 文本从数据库加载到 TRichEdit

    我目前正在将我们的软件解决方案从 Delphi 7 迁移到 2010 大部分更改都很简单 只剩下少量障碍 在表单上 我们使用 TRichEdit 它显示从 MSSQL 数据库中的 blob 字段抓取的 rtf 文本 Delphi 7 中是这
  • 如何在常规管道作业中触发多分支管道 Jenkins 作业?

    我想触发特定的多分支管道作业 maven 发布 工作流程 测试 特定分支 在常规管道作业中 是否有我需要指定的特殊 build 命令模式 代码片段生成器仅打印 没有这样的工作 maven release workflow test 通过反复
  • 根据元素在另一个已排序列表中的位置对 python 中的列表进行排序

    我想根据预先排序的列表对 Python 中的列表进行排序 presorted list 2C 3C 4C 2D 3D 4D unsorted list 3D 2C 4D 2D 我该如何排序unsorted list使得这些值以相同的顺序出现
  • Angular 6 HTML选择菜单设置默认值

    我习惯了旧的 AngularJS 方式来选择菜单和选择默认值等 但我很难理解如何在 Angular 中执行此操作 6 我有一系列菜单项 fontChoices label Trebuchet value Trebuchet MS Helve
  • Updatepanel 提供完整回发而不是异步回发

    我遇到了一个似乎非常著名的问题 我的 updatepanel 触发完整回发而不是异步回发 正常的解决方案是为所有动态添加的控件提供一个 ID 我已经这样做了 但我仍然得到完整的回发而不是异步回发 这是代码 HTML
  • 如何在 matplotlib 中绘制 3D 旋转图?

    假设您有一条 2D 曲线 例如 from matplotlib import pylab t numpy linspace 1 1 21 z t 2 pylab plot t z 产生 我想进行一场革命来实现 3d 绘图 参见http re
  • 如何在Android项目中使用ThreeTenABP

    我使用的是 Android Studio 2 1 2 我的 Java 设置如下 gt java version gt openjdk version 1 8 0 91 gt OpenJDK Runtime Environment build
  • Linq to Entities 中的动态 where 子句

    我正在使用 linq toEntity EF 我有一个带有 4 个字符串参数的构造函数 根据哪个参数不为空 我必须构建 linq 查询 我可以使用 if else 语句 但我还有其他带有 10 个参数的构造函数 在这种情况下 将会有很多组合
  • 在 SQL Server 上逐字使用 SOUNDEX()

    这是我的问题 例如我有一张桌子Products包含一个字段 Name Products ID Name 1 USB Key 10Go 2 Intel computer 3 12 inches laptop computer 我目前正在为 i
  • C# 中的 FlowDocument 内存问题

    我目前正在尝试解决释放 FlowDocument 资源的问题 我正在加载一个 rtf 文件并使用 TextRange Load 将其放入 FlowDocument 中 我注意到 在执行此操作后 它会保留这些资源 并且 GC 不会收集它 我运
  • 控制台应用程序中的 Twitter OAuth

    是否可以在不访问身份验证网页的情况下对 Twitter 控制台应用程序进行授权 我需要它 因为我正在开发可以从我们公司 Twitter 获取直接消息的应用程序 该控制台应用程序安排在 Web 服务器上 而不是由人类驱动 问候 阿列克谢 扎哈
  • 如何在 nhibernate 中复制和重试死锁

    查看我的日志 我可以看到我的应用程序很容易出现死锁 它们出现在我的应用程序的许多部分 1 有没有办法复制这个问题 即 我只在日志中看到过这一点 2 如果事务被锁定 重试的最佳 最简单方法是什么 3 如果我将调用包装在 try catch 中