2016-11-10 4 views
1

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.

+0

überprüfen Sie diese http://stackoverflow.com/questions/494550/how-does-transactionscope-roll-back-transactions –

+1

Sie haben tatsächlich die Möglichkeit zu wählen, nicht Teil einer Ambient-Transaktion sein, siehe meine Antwort unten. –

Antwort

1

Wenn Sie nicht möchten, dass die ersten beiden Methoden ausgeführt werden, verschieben Sie sie einfach aus dem Bereich der Umgebungstransaktion.

Wenn Sie keine Kontrolle über den Code haben, der eine Ambient-Transaktion startet, können Sie ihn unterdrücken, indem Sie eine neue Ambient-Transaktion erstellen: using (var scope = new TransactionScope(TransactionScopeOption.Suppress)).

+0

Mein Beispiel ist ein bisschen vereinfacht. Tatsächlich kann ich eine Methode schreiben, die bereits innerhalb einer Transaktion aufgerufen wurde. Ich habe keine Kontrolle darüber, wo der Bereich anfängt und endet, aber ich kann schreiben, wenn meine Aufrufe umgeleitet werden. Dies wird jedoch bei SQL-Abfragen auftreten, die sich auf die Leistung auswirken. – DDan

+0

Antwort updated –

Verwandte Themen