Могу ли я выполнять вложенные транзакции в NHibernate и как их реализовать? Я использую SQL Server 2008, поэтому поддержка определенно в СУБД.
Я нахожу, что если я попробую что-то вроде этого:
using (var outerTX = UnitOfWork.Current.BeginTransaction())
{
using (var nestedTX = UnitOfWork.Current.BeginTransaction())
{
... do stuff
nestedTX.Commit();
}
outerTX.Commit();
}
то к моменту, когда дело доходит до outerTX.Commit()
, транзакция стала неактивной и приводит к исключению ObjectDisposedException в сеансе AdoTransaction.
Итак, мы должны создавать вложенные сеансы NHibernate? Или есть какой-то другой класс, который мы должны использовать для переноса транзакций (я слышал о TransactionScope, но я не уверен, что это такое)?
Теперь я использую реализацию Ayende UnitOfWork (спасибо Sneal).
Простите любую наивность в этом вопросе, я все еще новичок в NHibernate.
Спасибо!
EDIT. Я обнаружил, что вы можете использовать TransactionScope, например:
using (var transactionScope = new TransactionScope())
{
using (var tx = UnitOfWork.Current.BeginTransaction())
{
... do stuff
tx.Commit();
}
using (var tx = UnitOfWork.Current.BeginTransaction())
{
... do stuff
tx.Commit();
}
transactionScope.Commit();
}
Однако я не так волнуюсь по этому поводу, так как он блокирует нас использованием SQL Server, а также я обнаружил, что если база данных удаленная, вам нужно беспокоиться о том, что MSDTC включен... еще один компонент, чтобы пойти не так. Вложенные транзакции настолько полезны и легко выполняются в SQL, что я вроде предположил, что NHibernate будет иметь какой-то способ эмуляции того же...