Es gibt zwei Hauptarten von Transaktionen; Verbindungstransaktionen und Umgebungstransaktionen. Eine Verbindungstransaktion (z. B. SqlTransaction) ist direkt mit der Datenbankverbindung (z. B. SqlConnection) verknüpft. Dies bedeutet, dass Sie die Verbindung weitergeben müssen - in einigen Fällen in Ordnung, aber "Erstellen / Verwenden / Freigeben" nicht zulassen. Verwendung und erlaubt keine db-übergreifende Arbeit. Ein Beispiel (für Leerzeichen formatiert):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
Nicht zu chaotisch, aber auf unsere Verbindung "conn" beschränkt. Wenn wir verschiedene Methoden aufrufen wollen, müssen wir jetzt "conn" weitergeben.
Die Alternative ist eine Umgebungstransaktion. Neu in .NET 2.0 ermöglicht das TransactionScope- Objekt (System.Transactions.dll) die Verwendung über eine Reihe von Vorgängen (geeignete Anbieter werden automatisch in die Umgebungstransaktion aufgenommen). Dies erleichtert das Nachrüsten in vorhandenen (nicht transaktionalen) Code und das Sprechen mit mehreren Anbietern (obwohl DTC beteiligt wird, wenn Sie mit mehr als einem sprechen).
Beispielsweise:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
Beachten Sie hier, dass die beiden Methoden ihre eigenen Verbindungen verarbeiten können (Öffnen / Verwenden / Schließen / Entsorgen), jedoch stillschweigend Teil der Umgebungstransaktion werden, ohne dass wir etwas übergeben müssen.
Wenn Ihr Code fehlerhaft ist, wird Dispose () ohne Complete () aufgerufen, sodass ein Rollback durchgeführt wird. Die erwartete Verschachtelung usw. wird unterstützt, obwohl Sie eine innere Transaktion noch nicht zurücksetzen können, um die äußere Transaktion abzuschließen: Wenn jemand unglücklich ist, wird die Transaktion abgebrochen.
Der andere Vorteil von TransactionScope ist, dass es nicht nur an Datenbanken gebunden ist. Jeder transaktionsbewusste Anbieter kann es verwenden. WCF zum Beispiel. Oder es gibt sogar einige TransactionScope-kompatible Objektmodelle (z. B. .NET-Klassen mit Rollback-Funktion - möglicherweise einfacher als ein Andenken, obwohl ich diesen Ansatz selbst nie verwendet habe).
Alles in allem ein sehr, sehr nützliches Objekt.
Einige Einschränkungen:
- Unter SQL Server 2000 wechselt ein TransactionScope sofort zum DTC. Dies ist in SQL Server 2005 und höher behoben. Es kann den LTM (viel weniger Overhead) verwenden, bis Sie mit 2 Quellen usw. sprechen, wenn er auf DTC erhöht wird.
- Es gibt einen Fehler , der bedeutet, dass Sie möglicherweise Ihre Verbindungszeichenfolge anpassen müssen