Почему бы не быть активной транзакции в NHibernate IPreUpdateEventListener / IPreInsertEventListener? - PullRequest
0 голосов
/ 14 января 2011

Я использую NHibernate 3. Мое приложение отлично работает при работе с SQL Server 2008, но имеет периодически возникающие ошибки в SQL 2000 (мы соответствующим образом изменили диалект NH).Все ошибки связаны с компонентом MDTC (распределенная транзакция).Обычно чтение работает нормально, но код взрывается во время сохранения / обновления, но не всегда с одной и той же ошибкой.Мы часто видели: «Распределенная транзакция завершена.Либо включите этот сеанс в новую транзакцию, либо в транзакцию NULL. '.

Я исследую основные причины этого и добавил некоторые записи.У меня определены перехватчики IPreUpdateEventListener и IPreInsertEventListener, поэтому я вхожу туда и в свой репозиторий.Я обнаружил, что к тому времени, когда я добираюсь до своего слушателя, в текущем сеансе транзакции не происходит.

Вот мой код хранилища:

public virtual void Save(object entity)
{
    logger.DebugFormat("Opening transaction to save entity type {0}.", entity.GetType().Name);

    using (var t = new TransactionScope())
    {
        GetSession().SaveOrUpdate(entity);
        logger.DebugFormat("Committing transaction.");
        t.Complete();
    }
}

А вот мой код прослушивателя событий:

logger.DebugFormat("Save/Insert entity. Transaction.Active = {0}", 
    persister.Factory.GetCurrentSession().Transaction != null 
    ? persister.Factory.GetCurrentSession().Transaction.IsActive.ToString()
    : "no transaction");

А вот вывод журнала:

2011-01-14 17:23:13,549 [9] DEBUG BaseRepository`1.Save - Opening transaction to save entity type XXXXXXX.
2011-01-14 17:23:13,566 [9] DEBUG BaseRepository`1.Save - Committing transaction.
2011-01-14 17:23:13,598 [9] DEBUG AuditEventListener.Audit - Save/Insert entity. Transaction.Active = False

Можете ли вы увидеть что-то не так с этим?Почему в предварительной вставке нет активной транзакции?Кто-нибудь знает что-нибудь особенное, что мне нужно сделать для Sql Server 2000 (MSDTC включен)?

Обратите внимание, что среда 2008 - это моя локальная машина с Windows 7, а сервером Sql Server 2000 является Server 2003.

1 Ответ

3 голосов
/ 15 января 2011

TransactionScope не создает транзакцию NHibernate.

Вы должны создать ее явно, используя session.BeginTransaction().Он будет автоматически зачислен в распределенную транзакцию (не забудьте Commit() до завершения)

...