W mojej aplikacji mam metoda wygląda następująco:Jak korzystać z transakcji dla różnych kontekstów?
public static bool DoLargeOperation()
{
bool res = true;
res = res && DoFirstSubOperation();
res = res && DoSecondSubOperation();
res = res && DoThirdSubOperation();
return res;
}
a każda z metod wewnętrznych wygląda następująco:
public static bool DoFirstSubOperation()
{
using (var context = new EntityFrameworkContext())
{
// data modification.
context.SaveChanges();
}
}
Na przykład DoFirstSubOperation()
i DoSecondSubOperation()
zakończona pomyślnie, ale DoThirdSubOperation()
zawiedzie. Jak wycofać zmiany wprowadzone przez dwie pierwsze funkcje?
Takie podejście nie przyniosła rezultatów:
using (var transaction = new TransactionScope())
{
res = res && DoFirstSubOperation();
res = res && DoSecondSubOperation();
res = res && DoThirdSubOperation();
}
Jedynym rozwiązaniem widzę jest zdefiniowanie kontekstu tak:
public static bool DoLargeOperation()
{
bool res = true;
using (var context = new EntityFrameworkContext())
{
using (var transaction = context.Database.BeginTransaction())
{
res = res && DoFirstSubOperation(context);
res = res && DoSecondSubOperation(context);
res = res && DoThirdSubOperation(context);
if (res)
{
transaction.Commit();
}
else
{
transaction.Rollback();
}
}
}
return res;
}
Ale jest to dopuszczalne, aby to zrobić? Czy istnieje inne rozwiązanie?
Co nie działało w * tym podejściu * ?. To najbardziej poprawny sposób na osiągnięcie tego, czego szukasz. – abatishchev
Nie cofa zmian w zakończonych operacjach. –
Bez 'scope.Commit()' nie powinien ich faktycznie zatwierdzać. Jak sprawdzić zmiany? Może jesteś w tej samej transakcji? Lub na zewnątrz, powiedz używając Management Studio? – abatishchev