Es sollte beachtet werden, dass bei Verwendung TransactionScopevon das try/catchKonstrukt, das Sie haben, nicht benötigt wird . Sie müssen lediglich den Bereich aufrufen Complete, um die Transaktion beim Beenden des Bereichs festzuschreiben.
Dies TransactionScopeist normalerweise die bessere Wahl, da Sie damit Aufrufe an andere Methoden verschachteln können, für die möglicherweise eine Transaktion erforderlich ist, ohne den Transaktionsstatus weitergeben zu müssen.
Wenn Sie BeginTransactiondas DbConnectionObjekt aufrufen , müssen Sie dieses Transaktionsobjekt weitergeben, wenn Sie andere Vorgänge in derselben Transaktion, jedoch mit einer anderen Methode ausführen möchten.
Mit TransactionScopesolange der Umfang existiert, wird sie alles im Griff, dass die Register mit dem aktuellen Transactionauf dem Thread, den Code sauberer zu machen und besser wartbar.
Darüber hinaus haben Sie den zusätzlichen Vorteil, dass Sie andere Ressourcen verwenden können, die an Transaktionen teilnehmen können, nicht nur die Verbindung zur Datenbank.
Es sollte beachtet werden, dass Sie in Situationen, in denen Sie Ihre Verbindungen und Datenbankoperationen optimal nutzen müssen, diese möglicherweise nicht verwenden möchten TransactionScope. Selbst für eine einzelne Datenbank besteht die Möglichkeit, dass der Distributed Transaction Coordinator verwendet wird und die Transaktion in eine verteilte Transaktion umgewandelt wird (auch für eine einzelne Datenbankverbindung).
In diesen Fällen möchten Sie möglicherweise eine verbindungsspezifische Transaktion weitergeben, während Sie Ihr Design durcheinander bringen.
Oder , wenn Sie wissen , dass Sie eine Ressource konsequent nutzen werden (und auf dem gleichen Thread), möchten Sie vielleicht eine Klasse erstellen , die Referenz zählt Ihre Verbindung / Transaktion.
Sie würden eine Klasse erstellen, die beim Erstellen Ihre Ressource erstellt / die Anzahl erhöht. Es würde auch implementieren IDisposable(in dem Sie dekrementieren / freigeben / festschreiben / abbrechen würden, wenn die Anzahl Null ist) und die Anzahl in einer Variablen speichern, die ThreadStaticAttributeauf sie angewendet wurde.
Auf diese Weise können Sie die Transaktionsverwaltung vom Logikcode trennen und dennoch eine einzelne Ressource ziemlich effizient verwalten (anstatt zu einer verteilten Transaktion zu eskalieren).