如何使用 NHibernate 锁定模式在更新之前锁定对象?

2024-01-31

首先让我说明一下我想要实现的目标。我有一张桌子,里面装满了工作。有一个 Web 服务,其方法允许更改作业数据,称为SaveJob。此方法检索作业及其所有数据,对新数据运行验证(这需要对其他表进行一些数据库查询),然后将其保存回数据库。有点慢。大约一秒钟。

偶尔会发生两种情况SaveJob同一工作上的调用会紧密相连,并且它们会互相冲突。目前,这是唯一的网络服务器,但我希望我的解决方案网络场兼容,因此即使我知道如何使用单例解决此问题,我还是希望由数据库处理锁。

问题是,当第二个 SaveJob 调用尝试读取已被另一个 SaveJob 调用更改的作业时,我是否可以使用 NHibernate 和 SQL Server 数据库锁来阻止第二个 SaveJob 调用?

我相信答案是肯定的,但我不太确定如何去做。我已阅读有关的文档ISession.Lock()我相信我需要的是使用NHibernate.LockMode.Upgrade

我的下一个问题是这个锁什么时候释放?

我假设它在事务提交时被释放,但我找不到任何明确说明这一点的文档。

但是,如果是这种情况,那么有没有办法让我打开另一个事务并运行一些查询,而不关闭我最初抓住这份工作时开始的事务?还是我have在一笔交易中完成这一切?


首先,我建议不要跨多个线程使用单个事务,因为 ISession 本身不是线程安全的。

当你使用LockMode.Upgrade在会议上,或在session.Get(),NHibernate会发出一个select with (rowlock)检索实体时的语句(详细信息可能取决于数据库类型和配置)。如果该对象之前被另一个线程检索过,则当前线程将等待,直到锁被释放或超时到期。当锁本身被释放时update语句执行于transaction.Commit(). Using LockMode.UpgradeNoWait提供类似的功能,只不过它不会等待,并且在获取锁定时会失败。

This 阿延德的帖子 http://ayende.com/blog/3946/nhibernate-mapping-concurrency还有一些关于 SQL NHibernate 发出的信息session.Lock().

您可以阅读有关不同类型的锁的信息NHibernate 文档第 11 章第 6 节 http://nhforge.org/doc/nh/en/index.html#transactions-locking.

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

如何使用 NHibernate 锁定模式在更新之前锁定对象? 的相关文章

随机推荐

  • PHP + SQL Server - 如何设置连接字符集?

    我正在尝试通过 php 将一些数据存储在 SQL Server 数据库中 问题是特殊字符未正确转换 我的应用程序的字符集是 iso 8859 1 服务器使用的是windows 1252 在插入之前手动转换数据没有帮助 似乎有一些 转换正在进
  • mpmath 矩阵求逆的替代方案或加速方案

    我正在用 python 编写一些代码 需要频繁地反转大方阵 100 200 行 列 我已经达到了机器精度的极限 所以开始尝试使用mpmath进行任意精度矩阵求逆 但它非常慢 即使使用gmpy 以精度 30 十进制 反转大小为 20 30 6
  • 如何使用 javascript 添加 svg?

    我正在使用此代码将 svg 插入到 div 标签中 var container document getElementById div id var svg document createElement svg svg setAttribu
  • 使用 Java 的 LinkedIn API 身份验证

    我是 Linked In API 认证新手 我去看了LinkedIn提供的API文档 它有 RUBY PYTHON 和 PHP 的示例 但我被要求使用 Java 实现同样的目标 我需要阅读链接中用户的个人资料 任何人都可以建议我任何链接或示
  • 机器 ID/主机名如何映射/解映射到对象 ID 中的 3 个字节?

    机器 ID 主机名如何映射 解映射到对象 ID 中的 3 个字节 我应该在哪里寻找Linux中的机器ID domU 12 31 39 13 02 56 看起来很奇怪 我不确定它是否正确 该函数不会从 ObjectID 获取您的主机名 它会向
  • Eigen::Ref<> 类的正确用法

    Eigen 引入了 Ref 类 以便在不需要编写模板函数时以 Eigen 对象作为参数编写函数 而无需使用不必要的临时变量 人们可以读到这一点here http eigen tuxfamily org dox TopicFunctionTa
  • 如何使用 htaccess 转发查询字符串?

    目前 我正在使用它来重写 URL RewriteEngine on RewriteRule page php name 1 NC So mysite com home被重写为mysite com page php name home 我怎样
  • Express:POST请求后Req.body未定义

    我在 app router 之前使用了express bodyParser 并且标题似乎是正确的 但我仍然在 req body 上未定义 var app express app use express bodyParser app use
  • ADO.NET 与 ADO.NET 实体框架

    ADO NET 和 ADO NET 实体框架哪个更快 没有什么比 ADO NET 数据读取器更快了 实体框架也在 地下室 使用了它 然而 实体框架可以帮助您从数据库映射到对象 对于 ADO NET 您必须自己完成此操作 这取决于你如何编程它
  • Dexie:如何添加到嵌套对象中的数组

    我正在使用 Dexie IndexedDB 包装器 并且尝试将一个对象添加到嵌套对象内的现有数组中 结构如下所示 Name John age 33 tags skill first NET second JAVA third special
  • Base64 编码数据有哪些缺点?

    在过去两年左右的时间里 我对多种类型的网络数据进行了 Base64 编码 图像 otf文件 文本等 它很实用 因为它作为一种临时的资产整合方法 数据直接嵌入CSS或HTML中 不必担心死链接 但是使用这种方法有什么缺点吗 Base64 编码
  • 使用sqlite、flutter应用程序导入数据库

    我的主要目标是使用 sqlite sqlflite 插件 将数据库导入到 flutter 应用程序中 而不必将所有创建表硬编码到应用程序代码中 我希望信息能够在本地访问手机 在飞行模式下从手机访问数据 这就是我使用 sqlite 的原因 我
  • Javascript - ReactJS - 以 ReadableStream 作为源显示图像

    我有 PNG 图像作为 ReadableStream 我需要使用此 ReadableStream 作为源显示 html 元素 img 我应该将其转换为某种东西吗 或者我该怎么做 谢谢你的答案 来自谷歌的docs https develope
  • 在另一个工厂内使用一个工厂 AngularJS

    我有一个模块 angular module myModule 然后是工厂 angular module myModule factory factory1 function some var s and functions 然后是另一家工厂
  • VB 中 .NET MVC3 Razor 视图中的命名空间引用?

    如何使用 Razor 视图引擎引用 NET MVC3 中的命名空间 据我所知 这可以在 C 中完成 using Namespace 然而在VB中这似乎不起作用 Imports Namespace 我说的是 vbhtml 文件内部 您正在使用
  • 二次读取法

    我必须为二次类编写一个读取方法 其中二次以 ax 2 bx c 的形式输入 该类的描述是这样的 添加一个读取方法 要求用户提供标准格式的方程并正确设置三个实例变量 因此 如果用户输入 3x 2 x 则将实例变量设置为 3 1 和 0 这将需
  • 如何创建字节数组并用随机数据填充它[重复]

    这个问题在这里已经有答案了 我想根据给定大小创建一个填充随机数据的字节数组 我该怎么做 我的方法的签名如下所示 private byte GetByteArray int sizeInKb 这是我尝试过的 private byte GetB
  • iOS 与 IPv6 和 Azure 的问题

    我们的 Xamarin iOS 应用程序之一被拒绝 因为 Service URI 似乎无法从 IPv6 网络获得 从 2016 年 6 月 1 日开始 Apple 希望所有 iOS 应用程序在纯 IPv6 网络中完全兼容 Microsoft
  • 快速检索 WKInterfaceLabel 的文本

    如何在 WatchKit 中获取 Swift 或 Objective C 中的标签文本 该类不是 UILabel 而是 WKInterfaceLabel 我也尝试过搜索苹果的类库 https developer apple com libr
  • 如何使用 NHibernate 锁定模式在更新之前锁定对象?

    首先让我说明一下我想要实现的目标 我有一张桌子 里面装满了工作 有一个 Web 服务 其方法允许更改作业数据 称为SaveJob 此方法检索作业及其所有数据 对新数据运行验证 这需要对其他表进行一些数据库查询 然后将其保存回数据库 有点慢