Was sind die Best Practices für Transaktionen in C # .Net 2.0? Welche Klassen sollten verwendet werden? Was sind die Fallstricke, auf die man achten muss usw. All das Commit- und Rollback-Zeug. Ich starte gerade ein Projekt, in dem ich möglicherweise einige Transaktionen ausführen muss, während ich Daten in die Datenbank einfüge. Alle Antworten oder Links für grundlegende Informationen zu Transaktionen sind willkommen.
c#
.net
transactions
Malik Daud Ahmad Khokhar
quelle
quelle
Antworten:
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):
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:
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:
quelle
quelle
Sie können die Transaktion auch in eine eigene gespeicherte Prozedur packen und auf diese Weise behandeln, anstatt Transaktionen in C # selbst auszuführen.
quelle
Wenn Sie es nur für db-bezogene Inhalte benötigen, unterstützen einige OR-Mapper (z. B. NHibernate) standardmäßig Transactinos.
quelle
Es hängt auch davon ab, was Sie brauchen. Bei einfachen SQL-Transaktionen können Sie versuchen, TSQL-Transaktionen durchzuführen, indem Sie BEGIN TRANS und COMMIT TRANS in Ihrem Code verwenden. Dies ist der einfachste Weg, hat jedoch Komplexität und Sie müssen vorsichtig sein, um ein ordnungsgemäßes Commit (und einen Rollback) durchzuführen.
Ich würde so etwas benutzen
Jeder Fehler führt dazu, dass Sie sofort aus
using
der Transaktion aussteigen und die Transaktion immer festgeschrieben oder zurückgesetzt wird (je nachdem, was Sie ihm sagen). Das größte Problem, mit dem wir konfrontiert waren, war sicherzustellen, dass es immer begangen wurde. Die Verwendung stellt sicher, dass der Umfang der Transaktion begrenzt ist.quelle