因此,首先让我说明我要完成的工作。我有一个填充了工作的表。还有一个 Web 服务,其方法允许更改作业数据,称为SaveJob
. 此方法检索作业及其所有数据,对新数据运行验证(需要对其他表进行一些数据库查询),然后将其保存回数据库。它有点慢。大约一秒钟。
偶尔会发生的情况是,两个SaveJob
电话会在同一个工作上紧密联系在一起,它们会相互重叠。现在这是唯一的网络服务器,但我希望我的解决方案网络场兼容,所以即使我知道如何使用单例解决这个问题,我更愿意让数据库处理锁。
问题是当它尝试读取已被另一个 SaveJob 调用更改的作业时,我可以使用 NHibernate 和 SQL Server 数据库锁来阻止第二个 SaveJob 调用吗?
我相信答案是肯定的,但我不确定如何去做。我已经阅读了有关的文档,ISession.Lock()
并且我相信我需要的是使用NHibernate.LockMode.Upgrade
我的下一个问题是这个锁什么时候释放?
我假设它在事务提交时被释放,但我找不到任何明确说明这一点的文档。
但是,如果是这种情况,那么有没有办法让我打开另一个事务并运行一些查询,而无需关闭我一开始就开始工作时开始的事务?还是我必须在一笔交易中完成这一切?