gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:53:22 25 4
gpt4 key购买 nike

所以首先让我说一下我要完成的工作。我有一个填充作业的表。还有一个Web服务,其方法允许更改作业数据,称为SaveJob。此方法检索作业及其所有数据,对新数据运行验证(需要对其他表进行一些数据库查询),然后将其保存回数据库。有点慢。大约一秒钟。

偶尔发生的是,两个SaveJob调用在同一作业上会并在一起,并且它们会彼此重叠。现在,这是唯一的Web服务器,但是我想使我的解决方案Web场兼容,所以即使我知道如何使用单例解决此问题,我也希望由数据库来处理锁。

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

我相信答案是肯定的,但我不确定如何解决。我已经阅读了有关ISession.Lock()的文档,并且我相信我需要使用NHibernate.LockMode.Upgrade
我的下一个问题是何时释放此锁?

我假定在提交事务时将其释放,但是我找不到任何明确说明此情况的文档。

但是,如果是这种情况,那么是否有办法让我打开另一个事务并运行一些查询而不关闭我最初抓到该工作时已经启动的事务?还是我必须在一次交易中完成所有这一切?

最佳答案

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

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

Ayende's post还具有有关SQL NHibernate在session.Lock()上发出的内容的一些信息。

您可以阅读NHibernate Documentation Chapter 11, Section 6上不同类型的锁。

关于.net - 如何使用NHibernate锁定模式在更新之前锁定对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18362228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com