首先让我说明我想要完成的事情.我有一个填充了工作的表.并且有一个Web服务,其方法允许更改所调用的作业数据SaveJob.此方法检索作业及其所有数据,在新数据上运行验证(需要对其他表进行一些数据库查询),然后将其保存回数据库.这有点慢.大约一秒钟.
会发生什么事有时SaveJob会在同一个工作中将两个电话紧密地联系在一起并且它们会相互重叠.现在,这是唯一的Web服务器,但我希望我的解决方案Web服务器场兼容,所以即使我知道如何使用单例来解决这个问题,我更愿意让数据库处理这些锁.
问题是我可以使用NHibernate和SQL Server数据库锁来尝试读取已被另一个SaveJob调用更改的作业时阻止第二次SaveJob调用吗?
我相信答案是肯定的,但我不确定如何去做.我已经阅读了有关该文档的文档ISession.Lock(),我相信我需要的是使用NHibernate.LockMode.Upgrade
我的下一个问题是这个锁何时被释放?
我假设它在事务提交时被释放但我找不到任何明确说明这一点的文档.
但是,如果是这种情况,那么有没有办法让我打开另一个事务并运行一些查询而不关闭我在第一时间抓住工作时开始的事务?或者我必须在一次交易中完成所有这些操作吗?
rae*_*ae1 10
首先,我建议不要跨多个线程使用单个事务,因为ISession本身不是线程安全的.
当您LockMode.Upgrade在会话中使用或打开时session.Get(),NHibernate将select with (rowlock)在您检索实体时发出声明(详细信息可能取决于数据库类型和配置).如果该对象先前已被另一个线程检索,则当前线程将等待锁定被释放或超时到期.update执行语句时,锁本身就会被释放transaction.Commit().使用LockMode.UpgradeNoWait提供类似的功能,除了它不等待,并且只是在锁定时失败.
这个Ayende的帖子也有一些关于SQL NHibernate 发布的信息session.Lock().
您可以在NHibernate文档第11章第6节中阅读不同类型的锁.
| 归档时间: |
|
| 查看次数: |
10988 次 |
| 最近记录: |