Entity Framework-Transaktionsverwaltung: Vergleich von SaveChanges(false) und AcceptAllChanges() mit TransactionScope
Im Entity Framework (EF) erfordert die Transaktionsverwaltung normalerweise nur minimale manuelle Vorgänge. Durch die Übergabe von „false“ an SaveChanges() richtet das Framework eine Transaktion ein oder nimmt daran teil. Nach erfolgreicher Ausführung schreibt AcceptAllChanges() die Änderungen in der Transaktion fest und schließt sie ab.
Einige Szenarien können jedoch von der gemeinsamen Verwendung von SaveChanges(false) und AcceptAllChanges() profitieren. Ihr Hauptvorteil liegt in verteilten Transaktionen mit mehreren Kontexten.
Betrachten Sie das folgende problematische Codebeispiel:
<code>using (TransactionScope scope = new TransactionScope()) { // 对 context1 执行操作 // 对 context2 执行操作 // 保存并丢弃更改 context1.SaveChanges(); // 保存并丢弃更改 context2.SaveChanges(); // 如果执行到这里,则一切看起来都很正常。 scope.Complete(); }</code>
Wenn context2.SaveChanges() fehlschlägt, nachdem context1.SaveChanges() erfolgreich ausgeführt wurde, wird die gesamte verteilte Transaktion abgebrochen. Leider hat EF die Änderungen in context1 verworfen und kann den Fehler nicht beheben oder effektiv protokollieren.
Um dieses Problem zu beheben, verwenden Sie bitte die folgende modifizierte Methode:
<code>using (TransactionScope scope = new TransactionScope()) { // 对 context1 执行操作 // 对 context2 执行操作 // 保存更改,但不要立即丢弃 context1.SaveChanges(false); // 保存更改,但不要立即丢弃 context2.SaveChanges(false); // 如果执行到这里,则一切看起来都很正常。 scope.Complete(); context1.AcceptAllChanges(); context2.AcceptAllChanges(); }</code>
Diese Änderung ermöglicht es beiden Kontexten, ihre Änderungen erst zu übernehmen, nachdem die Transaktion erfolgreich abgeschlossen wurde. Wenn eine Ausnahme auftritt, werden die Änderungen im ObjectStateManager des Kontexts für die weitere Verarbeitung, z. B. Wiederholungsversuche oder Protokollierung, gespeichert.
Daher bieten SaveChanges(false) und AcceptAllChanges() eine größere Flexibilität in verteilten Transaktionsszenarien mit der Möglichkeit, auftretende Fehler zu reparieren und zu protokollieren.
Das obige ist der detaillierte Inhalt vonSavechanges (Falsch) und AcceptAllchanges () in EF: Wann sollten Sie sie für verteilte Transaktionen verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!