Я столкнулся с проблемой, когда транзакция не откатывается при использовании TransactionScope
.
Мы используем NHibernate с базой данных SQLite в памяти, поэтому мы ограничиваемся только одним подключением к БДв течение всего времени жизни приложения (в данном случае некоторые модульные тесты).
using (var ts = new TransactionScope(TransactionScopeOption.Required,
TimeSpan.Zero))
{
using (var transaction = _repository.BeginTransaction())
{
_repository.Save(entity);
transaction.Commit();
}
// ts.Complete(); <- commented Complete call still commits transaction
}
Даже если я удалю внутреннюю вложенную транзакцию NHibernate, поэтому код будет таким, как показано ниже, транзакция все еще фиксируется,
using (var ts = new TransactionScope(TransactionScopeOption.Required,
TimeSpan.Zero))
{
_repository.Save(entity);
} // no Complete(), but the transaction still commits
Ожидается ли недавно открытое соединение SQLite внутри блока TransactionScope
, чтобы включить его в транзакцию?
Опять же, я не могу предоставить ему новое соединение, потому что это очистит базу данных.
Использование NHibernate 3.0 и SQLite 1.0.66.0, обеих последних версий на момент написания.
Примечание: использование transaction.Rollback()
на объекте NHibernate ITransaction
корректно откатывает транзакцию, просто поддержка TransactionScope
не работает.