Использование вложенных транзакций в C # DataContext DNN - PullRequest
0 голосов
/ 27 сентября 2018

Я использую эту базовую структуру:

using(IDataContext ctx = DataContext.Instance())
{
  try{
    ctx.BeginTransaction();

    ctx.Commit();
  }
  catch(Exception)
  {
    ctx.RollbackTransaction();
    throw;
  }
}

То, что я хотел бы сделать, это вкладывать транзакции, чтобы можно было строить с использованием функционального программирования.

Очень упрощенная версия:

public void DoSomething(){
  using(IDataContext ctx = DataContext.Instance())
  {
    try{
      ctx.BeginTransaction();
       // make a change to the data
      ctx.Commit();
    }
    catch(Exception)
    {
      ctx.RollbackTransaction();
      throw;
    }
  }  
} 

public void CallingFunction(){
  using(IDataContext ctx = DataContext.Instance())
  {
    try{
      ctx.BeginTransaction();
      //do some stuff
      DoSomething();
      //do some other stuff
      ctx.Commit();
    }
    catch(Exception)
    {
      ctx.RollbackTransaction();
      throw;
    }
  }  
} 

Поэтому я хочу иметь возможность иметь несколько CallingFunctions, которые все вызывают DoSomething (), но если в коде, который появляется в CallingFunction после DoSomething, возникает исключение, то я хочу, чтобы DoSomething откатывалсятакже.

DoSomething может быть в том же классе, что и CallingFunction, или в другом классе.

Конечно, это возможно, но я не смог найти ответ.Спасибо за вашу помощь.

После проверки моего кода я понял, что он использует DataContext из пространства имен DotNetNuke.Data.Может быть, эксперт DNN может помочь?

1 Ответ

0 голосов
/ 27 сентября 2018

Вы должны внедрить контекст во все функции, которые должны его использовать, вместо того, чтобы создавать свои собственные.Таким образом, все изменения перед фиксацией выполняются в одной транзакции, и вы можете откатить все, если произойдет ошибка.

...