Я использую эту базовую структуру:
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?
Вы должны внедрить контекст во все функции, которые должны его использовать, вместо того, чтобы создавать свои собственные. Таким образом, все изменения перед фиксацией находятся в одной транзакции, и вы можете откатить все, если возникнут какие-либо ошибки.
так передать ctx в другие функции? конечно. так просто. Спасибо