Es sollte beachtet werden, dass bei Verwendung TransactionScope
von das try/catch
Konstrukt, das Sie haben, nicht benötigt wird . Sie müssen lediglich den Bereich aufrufen Complete
, um die Transaktion beim Beenden des Bereichs festzuschreiben.
Dies TransactionScope
ist 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 BeginTransaction
das DbConnection
Objekt 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 TransactionScope
solange der Umfang existiert, wird sie alles im Griff, dass die Register mit dem aktuellen Transaction
auf 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 ThreadStaticAttribute
auf 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).