Работа с вложенными транзакциями с использованием NHibernate в Sharp Architecture - PullRequest
2 голосов
/ 23 июня 2010

Я хотел бы знать, как работать с вложенными транзакциями, например, между одним началом и фиксацией у меня есть другая начало и фиксация.Причина, по которой я вас спрашиваю, заключается в том, что в моем проекте ApplicationServices у меня есть службы, которые зависят от других служб.И метод родительской службы начинает транзакцию, и в зависимости от некоторой логики ему может потребоваться вызвать один из методов зависимых дочерних служб, которые также в свою очередь выполняют begin и commit.Метод дочерних служб также используется независимо от контроллеров, поэтому я должен использовать начало и фиксацию в дочерних службах.

Короче говоря, в итоге у меня будет что-то подобное

   using( Repository1.DbContext.BeginTransaction() )
   {
      try
      {
         .....
         .....
         using( Repository2.DbContext.BeginTransaction() )
         {
            try
            {
               .....
               .....
               Repository2.DbContext.CommitTransaction()
            }
            catch
            {
               Repository2.DbContext.RollBack();
               throw;
            }
        }
        Repository1.DbContext.CommitTransaction()
      }
      catch
      {
         Repository1.DbContext.RollBack();
         throw;
      }
   }

Итак, есть вложенные начала и коммиты.Я хотел бы знать

- каково будет поведение, когда вложенный репозиторий2 будет успешно зафиксирован, но родительский репозиторий1 откатан?

Как я могу контролировать это поведение в коде, например

-Если я не хочу делать дочернюю транзакцию частью родительской транзакции.- как выяснить, выполняется ли уже транзакция перед созданием дочерней транзакции

или есть ли другое элегантное решение этой проблемы?

Спасибо Набил

Ответы [ 3 ]

3 голосов
/ 23 июня 2010

NHibernate не поддерживает вложенные транзакции.Является ли DbContext одинаковым для Repository1 и Repository2?Если это так, то они могут участвовать в одной транзакции.Если нет, вам придется разделить транзакции на два метода или взглянуть на пространство имен System.Transactions .

0 голосов
/ 23 июня 2010
0 голосов
/ 23 июня 2010

Если вы установите границы транзакций на уровне контроллеров, я бы сказал, что вам не нужны вложенные транзакции.

...