#mysql #nhibernate #transactionscope
#mysql #nhibernate #transactionscope
Вопрос:
Я использую NHibernate 3.1.0 с соединителем MySQL 6.3.5. Как правило, мои методы репозитория заключены в транзакцию NHibernate. Однако для кода службы или приложения, вызывающего методы репозитория, также может потребоваться область транзакции — следовательно, смешивание транзакций NHibernate с .TransactionScope от NET. Смоделированный тест выглядит следующим образом:
[Test]
public void CanPerformNestedSave()
{
using (var tx = new TransactionScope())
{
var user = new AdminUser { Email = "user@test.com", Name = "Test User 1", Password = "123" };
using (ISession session = OpenSession())
{
using (var tx = session.BeginTransaction())
{
entity.ModifiedAt = DateTime.Now;
session.SaveOrUpdate(entity);
tx.Commit();
return entity;
}
}
tx.Complete();
}
}
Тест завершается неудачей со следующей ошибкой:
NHibernate.Исключение TransactionException: сбой запуска с исключением SQL —-> System.Исключение InvalidOperationException: вложенные транзакции не поддерживаются.
Я прочесал Интернет, чтобы найти решение для этого сценария, и, надеюсь, сообщество StackOverflow сможет помочь.
Комментарии:
1. Спасибо Lulian (ниже). В конце концов, я решил скорее реализовать свой собственный шаблон Unit Of Work, используя сеанс NHibernate. beginTransaction для управления этим.
Ответ №1:
Я писал об этом в блоге здесь.
В сообщении в блоге NServiceBus создает внешний TransactionScope для обработчиков, а сеанс Nhibernate и транзакции используются внутри обработчика.
Комментарии:
1. Спасибо, Лулиан, я прочитал вашу статью, но поскольку я не использую NServiceBus, я изо всех сил пытаюсь понять отношение статьи к моей проблеме. У меня есть два разных метода инициирования транзакций — один из NH, а другой из .NET — и хотя они должны хорошо сочетаться, похоже, что это не так. Я просто получаю сообщение об ошибке Вложенные транзакции не поддерживаются .
2. В случае NServiceBus возникает та же проблема, поскольку он всегда выполнял обработчики в контексте TransactionScope. И внутри обработчика вам нужно использовать транзакцию NH. Итак, в основном у вас есть внешний TransactionScope и внутренняя ITransaction, а MySqlConnector не поддерживает это из коробки.
3. Просто для пояснения, в статье предлагается модифицировать соединитель mysql. Вы можете найти подробности изменения в комментариях