非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显示锁超时或命令超时信息。请帮我实现这个目标。
谢谢你的帮助。

非hibernate设置命令查询超时时间和悲观锁定

要实现悲观锁定,您需要使用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看起来很有希望,但我看不出有什么方法可以做到这一点(对于更新),除了系统范围。