Nhibernate установка периода ожидания запроса для команд и пессимистической блокировки - PullRequest
0 голосов
/ 12 ноября 2011

Я хочу указать определенный тайм-аут команды (или LOCK_TIMEOUT) для SQL, и как только этот тайм-аут достигнут, в 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-сервере мы использовали для этого следующий 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. Пожалуйста, помогите мне достичь этого.
Заранее благодарим за помощь.

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

Для достижения пессимистической блокировки вам необходимо получить подробную информацию об объекте с помощью 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.
    }
}
0 голосов
/ 12 ноября 2011

Интересно, могли бы вы адаптировать этот подход к вашим целям?Конечно, это не будет автоматом.и это означало бы, что переданный в resourceName, вероятно, должен был бы быть объединением вашего типа сущности и его PK.

В качестве альтернативы, command_timeout выглядит многообещающе, но я не могу найти способделать это (для обновлений) любым способом, кроме общесистемного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...