非hibernate设置命令查询超时时间和悲观锁定
本文关键字:时间 悲观 锁定 超时 查询 hibernate 设置 命令 | 更新日期: 2023-09-27 18:14:36
我希望为SQL指定一个特定的命令超时(或LOCK_TIMEOUT),一旦达到这个超时,就会在nHibernate中引发异常(或警报)。
下面是我写的伪代码示例:
using (var session = sessionFactory.OpenSession()) {
using (var sqlTrans = session.BeginTransaction()) {
ICriteria criteria = session.CreateCriteria(typeof(Foo));
criteria.SetTimeout(5); //Here is the specified command timout, eg: property SqlCommand.CommandTimeout
Foo fooObject = session.Load<Foo>(primaryKeyIntegerValue, LockMode.Force);
session.SaveOrUpdate(fooObject);
sqlTrans.Commit();
}
}
在SQL server中,我们使用以下SQL来实现这一点:
BEGIN TRAN
SET LOCK_TIMEOUT 500
SELECT * FROM Foo WITH (UPDLOCK, ROWLOCK) WHERE PrimaryKeyID = 1000001
如果PrimaryKeyID行在其他事务中将被锁定,SQL Server将显示以下错误消息:
Msg 1222, Level 16, State 51, Line 3
Lock request time out period exceeded
同样,我希望使用nHibernate显示锁超时或命令超时信息。请帮我实现这个目标。谢谢你的帮助。
要实现悲观锁定,您需要使用ICritiera获取对象的详细信息。
修改后的代码如下:
using (var session = sessionFactory.OpenSession()) {
using (var sqlTrans = session.BeginTransaction()) {
ICriteria criteria = session.CreateCriteria<Foo>();
criteria.Add(Restrictions.Eq(fieldOnWhichYouWishToGetTheLock, fieldValue));
criteria.SetLockMode(LockMode.Upgrade);
criteria.SetTimeout(5);
Foo fooObject = (Foo)criteria.List<Foo>();
//Make the changes to foo object and save as usual.
}
}
我想知道您是否可以采用这种方法来达到您的目的?当然,这不会是自动的。这意味着传入的resourceName可能需要是实体类型及其PK的连接。
或者,command_timeout看起来很有希望,但我看不出有什么方法可以做到这一点(对于更新),除了系统范围。