Использование TransactionScope () с проблемой beginTransaction() от NHibernate

#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. Вы можете найти подробности изменения в комментариях