In meiner Anwendung habe ich Methode sieht wie folgt aus:Wie verwendet man Transaktionen für verschiedene Kontexte?
public static bool DoLargeOperation()
{
bool res = true;
res = res && DoFirstSubOperation();
res = res && DoSecondSubOperation();
res = res && DoThirdSubOperation();
return res;
}
Und jeder der internen Verfahren sieht wie folgt aus:
public static bool DoFirstSubOperation()
{
using (var context = new EntityFrameworkContext())
{
// data modification.
context.SaveChanges();
}
}
Zum Beispiel DoFirstSubOperation()
und DoSecondSubOperation()
erfolgreich abgeschlossen, aber DoThirdSubOperation()
ausfällt. Wie rolle ich die Änderungen der ersten beiden Funktionen zurück?
Dieser Ansatz hat nicht gebracht Ergebnisse:
using (var transaction = new TransactionScope())
{
res = res && DoFirstSubOperation();
res = res && DoSecondSubOperation();
res = res && DoThirdSubOperation();
}
Die einzige Lösung, die ich sehe, ist der Kontext wie so zu definieren:
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;
}
Aber ist es akzeptabel, dies zu tun? Oder gibt es eine andere Lösung?
Was hat in diesem Ansatz nicht funktioniert? Es ist der richtige Weg, um das zu erreichen, wonach Sie suchen. – abatishchev
Es werden keine Änderungen in abgeschlossenen Operationen rückgängig gemacht. –
Ohne 'scope.Commit()' sollte es sie eigentlich nicht begehen. Wie überprüfen Sie die Änderungen? Vielleicht sind Sie in derselben Transaktion? Oder extern, sagen wir mal Management Studio? – abatishchev