dieses Stück Code unter BerücksichtigungC# -Transaktion mit behandelter Ausnahme wird immer noch zurückgesetzt?
using(TransactionScope tran = new TransactionScope()) {
insertStatementMethod1();
insertStatementMethod2();
// this might fail
try {
insertStatementMethod3();
} catch (Exception e) {
// nothing to do
}
tran.Complete();
}
alles getan wird in insertStatementMethod1
und insertStatementMethod2
gehen zurück gerollt werden? Auf jeden Fall? Wenn ich möchte, dass sie trotzdem ausgeführt werden, müsste ich überprüfen, ob es insertStatementMethod3
vor der Transaktion fehlschlägt, und meinen Transaktionscode basierend darauf erstellen?
aktualisieren
Der Code sieht ähnlich wie diese
using(TransactionScope tran = new TransactionScope()) {
// <standard code>
yourExtraCode();
// <standard code>
tran.Complete();
}
, wo ich die yourExtraCode()
Methode
public void yourExtraCode() {
insertStatementMethod1();
insertStatementMethod2();
// this call might fail
insertStatementMethod3();
}
ich nur die yourExtraCode()
Methode kann schreiben bekommen bearbeiten, so kann ich nicht Wählen Sie im Transaktionsbereich oder nicht. Eine einfache mögliche Lösung wäre dies:
public void yourExtraCode() {
insertStatementMethod1();
insertStatementMethod2();
// this call might fail
if (findOutIfIcanInsert()) { // <-- this would come by executing sql query
try {
insertStatementMethod3();
} catch (Exception e) {
// nothing to do
}
}
}
Aber das würde mit der Notwendigkeit des Nachschlagens Dinge in der db die die Leistung beeinträchtigen würde. Gibt es einen besseren Weg, oder muss ich herausfinden, bevor ich die Methode aufrufen würde? Ich habe es ausprobiert und natürlich wurde die Transaktion wie erwartet zurückgesetzt.
überprüfen Sie diese http://stackoverflow.com/questions/494550/how-does-transactionscope-roll-back-transactions –
Sie haben tatsächlich die Möglichkeit zu wählen, nicht Teil einer Ambient-Transaktion sein, siehe meine Antwort unten. –