2010-12-21 7 views

Antwort

20

Da sie verschachtelt sind, wird die innere Transaktion zurückgesetzt.

Dies ist nicht die ganze Geschichte und hängt davon ab, wie Sie die verschachtelte Transaktion erstellen, aber standardmäßig wird ein Rollback ausgeführt.

This article geht in die Tiefe über TransactionScope und sollte die meisten Ihrer Fragen beantworten.


Verteilte oder nicht ist irrelevant.

+0

@Frantisek erwähnt verteilte Transaktionen. Woher weiß ich, dass ich eine verteilte Transaktion verwende? – Tebo

+0

Ich vermute ich lag falsch. Mit TransactionScope brauchen Sie wahrscheinlich dtc nicht, damit es funktioniert. Lesen Sie hierzu http://msdn.microsoft.com/en-us/library/ms172152(v=vs.90).aspx: "Obwohl ein verschachtelter Bereich der Ambient-Transaktion des Root-Bereichs beitreten kann, ruft Complete im verschachtelten Bereich auf hat keinen Einfluss auf den Root-Bereich. Nur wenn alle Bereiche vom Root-Bereich bis zum letzten geschachtelten Bereich stimmen, um die Transaktion zu committen, wird die Transaktion festgeschrieben. " –

+1

Ich bin mir sicher, dass Sie darüber Bescheid wissen, aber die Begriffe "innere Transaktion" und "verschachtelte Transaktion" sind IMHO unangemessen, wenn Sie über TransactionScope sprechen, da es eigentlich keine verschachtelten Transaktionen, sondern nur verschachtelte TransactionScopes gibt. Wenn Sie TransactionScopeOption.Required wählen, ist es nur eine große Transaktion und mit TransactionScopeOption.RequiresNew gibt es 2 völlig unabhängige Transaktionen, aber sie sind nicht verschachtelt im Sinne von (geschlossenen) verschachtelten Transaktionen. –

68

Es hängt von der Bereichsoption ab, mit der Sie den verschachtelten Transaktionsbereich mit starten.

Wenn Sie die Standardoption verwenden TransactionScopeOption.Required dann die verschachtelten Bereich in derselben Transaktion wie der äußere Umfang gewinnen wird und als solche, wenn der äußere Umfang rollt der innere Umfang wieder wird auch wieder selbst gerollt werden, wenn es Complete genannt hat.

Wenn Sie jedoch TransactionScopeOption.RequiresNew verwenden, dann beginnt der verschachtelte Bereich seine eigene Transaktion und schließt sie separat vom äußeren Bereich ab, sodass er nicht zurückgesetzt wird, selbst wenn der äußere Bereich zurückgesetzt wird.

Wenn Sie TransactionScopeOption.Suppress verwenden, dann wird der verschachtelte Bereich nicht an der äußeren Transaktion teilnehmen und nicht-transaktional abgeschlossen werden, daher nicht Teil der Arbeit, die zurückgesetzt würde, wenn die äußere Transaktion zurückgesetzt wird.

+0

Perfekte Antwort :) –