Я использую 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.