NHibernate: Вы всегда должны фиксировать, и что это делает на чтение? - PullRequest
2 голосов
/ 27 января 2010

Я использую NHibernate для связи с базой данных в моем проекте C # .NET. При общении с базой данных - всегда ли мне нужно совершать транзакцию? Что это на самом деле делает при чтении? Я иногда забываю совершать коммиты при чтении, но, похоже, все работает нормально.

using (var tx = Session.BeginTransaction())
{
    var fromDb = Session.Get<User>(user.Id);
    Assert.AreEqual(user.Id, fromDb.Id);
    tx.Commit(); // <-- Necessary?? 
}

Ответы [ 2 ]

4 голосов
/ 27 января 2010

Почему вы начинаете транзакцию, если читаете только во время этой транзакции? Это совершенно не обязательно.

Хотя верно, что если вы установили режим разъединения соединения на 'after_transaction', соединение будет закрыто только после того, как транзакция будет зафиксирована или откатана. Так что в этих случаях действительно может быть удобно начать транзакцию, если вы хотите выполнить несколько действий чтения.

На самом деле то, что я в основном делаю, это:

Person p = null;
using( ISession s = sf.OpenSession())
{
    With.Transaction (s, () => p = s.Get (1));
}

например.

Где 'With.Transaction' - служебный метод, который запускает транзакцию, выполняет переданный делегат (действие), а затем фиксирует или откатывает транзакцию.

Очень похоже на это:

public static class With
{
    public static void Transaction( ISession s, Action proc )
    {
        using( ITransaction thx = s.BeginTransaction () )
        {
            try
            {
                proc();
                thx.Commit();
            }
            catch
            {
                 thx.Rollback();
                 throw;
            }
        }
    }
}

Но моя реализация все еще немного отличается, поскольку я не использую ISession NHibernate напрямую. Вместо этого я создал оболочку вокруг ISession, и в этой оболочке я также отслеживаю текущую транзакцию (если она есть) для этого сеанса. Таким образом, в методе With.Transaction я могу проверить, есть ли в моем сеансе активная транзакция или нет, и затем я только начинаю транзакцию, если нет активной транзакции.

(Кредиты идут в Айенде за идею With.Transaction).

1 голос
/ 27 января 2010

Хорошая идея - зафиксировать или откатить транзакцию. Из MSDN :

BEGIN TRANSACTION запускает локальный транзакция для выдачи соединения заявление. В зависимости от текущий уровень изоляции транзакции настройки, много ресурсов, приобретенных для поддерживать операторы Transact-SQL выданные соединения заблокированы транзакция до ее завершения либо с совершением транзакции или Оператор ROLLBACK TRANSACTION. Транзакции оставлены на долгое время периоды времени могут помешать другим пользователи от доступа к этим заблокированным ресурсы, а также может помешать журналу усечение.

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