it-swarm.com.de

Benötige ich "transactionScope.Complete ();"?

Soweit ich es verstehe, ist die "korrekte" Verwendung einer TransactionScope der Aufruf von transactionScope.Complete();, bevor der using-Block beendet wird. So was:

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
    //...
    //I'm using this as a NOLOCK-alternative in Linq2sql.
    transactionScope.Complete();
}

Ich habe jedoch gesehen, dass der Code ohne es funktioniert, und sogar die Antwort, die ich gelernt habe, um es zu benutzen lässt sie weg. Also meine Frage ist, muss es verwendet werden oder nicht? 

7
ispiro

Also meine Frage ist, muss es verwendet werden oder nicht?

Complete muss verwendet werden, wenn Aktualisierungen vorgenommen werden, um die Transaktion zu COMMIT. Andernfalls gibt der Transaktionsmanager eine ROLLBACK aus und macht die vorgenommenen Änderungen rückgängig.

Bei einer schreibgeschützten Transaktion wie Ihrem Beispiel fällt mir kein wesentlicher Unterschied mit oder ohne Complete ein. Die vom Transaktionsmanager ausgegebene Variable COMMIT oder ROLLBACK hat in beiden Fällen den gleichen Nettoeffekt wie die Freigabe von Sperren und Ressourcen, die von der Transaktion gehalten werden. 

Obwohl es nicht zwingend erforderlich ist, Complete in einer Nur-Lese-Transaktion aufzurufen, ist dies immer noch eine bewährte Methode, IMHO. Betrachten Sie den armen Entwickler, der später unabsichtlich Datenmodifikationscode zu Ihrem Transaktionsblock hinzufügt, ohne dass Complete fehlt.

7
Dan Guzman

Ja, Sie müssen es verwenden. Auf diese Weise können Sie den Compiler über Microsoft-Dokumente in der TransactionScope -Klasse informieren, dass Sie Ihre Aufgaben erfolgreich abgeschlossen haben:

Wenn Ihre Anwendung alle Arbeiten abgeschlossen hat, die sie in einer Transaktion ausführen möchte, sollten Sie die Complete-Methode nur einmal aufrufen, um den Transaktionsmanager darüber zu informieren, dass die Transaktion festgeschrieben werden kann. Wenn Sie diese Methode nicht aufrufen, wird die Transaktion abgebrochen.

Auch für die Complete Methode:

Wenn Sie diese Methode nicht aufrufen, wird die Transaktion abgebrochen, da der Transaktionsmanager dies als Systemfehler oder als Ausnahmebedingungen im Rahmen der Transaktion interpretiert. Sie sollten jedoch auch beachten, dass der Aufruf dieser Methode kein Commit der Transaktion garantiert. Es ist lediglich eine Möglichkeit, den Transaktionsmanager über Ihren Status zu informieren. 

3
Unnamed

im Prinzip wird die Anweisung using zur Kompilierungszeit vom C # -Compiler in diese konvertiert

       TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })
        try
        {
           //your works
        }
        finally
        {
            if (transactionScope != null)
                ((IDisposable)transactionScope).Dispose();
        }

Das ist also alles, was Sie von C # erwarten sollten. Sie müssen nur Ihre Arbeit mit dem TransactionScope erledigen 

Wenn das TransactionScope-Objekt die Transaktion ursprünglich erstellt hat, erfolgt die eigentliche Ausführung der Transaktion durch den Transaktionsmanager nach der letzten Codezeile im Verwendungsblock. Wenn die Transaktion nicht erstellt wurde, erfolgt die Festschreibung immer dann, wenn Commit vom Eigentümer des Transaktionsobjekts aufgerufen wird. Zu diesem Zeitpunkt ruft der Transaktionsmanager die Ressourcenmanager auf und fordert sie auf, entweder festzuschreiben oder einen Rollback auszuführen, je nachdem, ob die Complete-Methode für das TransactionScope-Objekt aufgerufen wurde.

ein Aufruf dieser Methode garantiert nicht, dass die Transaktion festgeschrieben wird. Es ist lediglich eine Möglichkeit, den Transaktionsmanager über Ihren Status zu informieren. Nach dem Aufrufen der Complete-Methode können Sie nicht mehr über die Current-Eigenschaft auf die Ambient-Transaktion zugreifen. Wenn Sie dies versuchen, wird eine Ausnahme ausgelöst.

Die using-Anweisung stellt sicher, dass die Dispose-Methode des TransactionScope-Objekts auch dann aufgerufen wird, wenn eine Ausnahme auftritt. Die Dispose-Methode markiert das Ende des Transaktionsbereichs. Ausnahmen, die nach dem Aufrufen dieser Methode auftreten, wirken sich möglicherweise nicht auf die Transaktion aus. Diese Methode stellt auch die Umgebungstransaktion in ihrem vorherigen Zustand wieder her.

Eine TransactionAbortedException wird ausgelöst, wenn der Bereich die Transaktion erstellt und die Transaktion abgebrochen wird. Eine TransactionInDoubtException wird ausgelöst, wenn der Transaktionsmanager keine Commit-Entscheidung treffen kann. Es wird keine Ausnahme ausgelöst, wenn die Transaktion festgeschrieben ist.

hoffe das wird für dich klar

0
H-a-Neo