Datenzugriff mit ADO.NET und .NET Core

Transaktionen richtig handhaben

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
ADO.NET Core bietet – wenn auch nicht im gleichen Umfang wie die Classic-Version – die Möglichkeit zu Transaktionen, wenn der Server bzw. die dahinter stehende Datenbank dies unterstützt. Hier zeigt Thorsten Kansy die richtige Verwendung von Transaktionen mittels SqlTransaction.
06:24

Transkript

Transaktionen sind eine weitere wichtige Technik, wenn es darum geht, mit Daten umzugehen, besonders Daten zu ändern oder zwischen zwei Leseversuchen sicherzustellen, dass Daten sich nicht ändern. Der SQL-Server, sprich die dahinter liegenden Datenbanken eigentlich, das betrifft nur den SQL-Server im Speziellen, bieten daher Transaktionen an. ADO.NET Core ist in der Lage, einen Teil dieser Technik tatsächlich zu benutzen. Sie sehen, dass offenbar die klassische Version in der Lage war, auf der einen Seite wirklich dedizierte Datenbankenverbindungen zu unterstützen, DbTransaction, für einen SQL-Server SqlTransaction. Das kann auch ADO.NET Core, aber den TransactionScope, den ADO.NET Classic bietet, den kann leider das ADO.NET Core nicht aufbieten. Das liegt wohl weniger am ADO.NET Core selbst, sondern schlicht am .NET -Framework Core, wo diese Klasse noch nicht installiert ist. Das bedeutet, man muss sich hier etwas begnügen. Man kann Transaktionen beginnen, man kann Transaktionen entsprechend freigeben, also commiten. Man kann Rollback durchführen und in den seltensten Fällen sogar sowas wie einen Save durchführen. Ich zeige Ihnen kurz im Beispiel, wie das aussehen kann im Code. Die Arbeit mit Transaktionen ist eigentlich recht einfach. Ich habe da was vorbereitet. Ich kopiere das hinein. Da wir kein TransactionScope zur Verfügung haben, gibt es auch keine verteilte Transaktion. Also Sie können keine Transaktion über mehrere Server laufen lassen deswegen. Daher ist das Objekt, das alles zusammenhält, zwangsläufig ein Connection-Objekt an der Stelle. In vielen praktischen Fällen ist es das sowieso, verteilte Transaktionen sind ein relativ seltenes Phänomen. Dennoch ist hier zwingend so. Das heißt, ich baue eine Verbindung auf. Und kann dann einzelne Abfragen durchführen, die entsprechend zum Beispiel sich innerhalb einer Transaktion befinden. Das heißt ein using-Block, der ein SqlTransaction-Objekt umschließt. Die Transaktion wird mit BeginTransaction gestartet. Das heißt, das liefert mir die Verbindung selbst. Dann kann ich innerhalb der Verbindung entsprechende Statements ausführen, natürlich mit dem SqlCommand-Objekt wieder. Hier habe ich aber die kuriose Situation, dass ich, selbst wenn ich CreateCommand benutze, was offenbar auf das gleiche Objekt zugreift, muss ich dennoch, genau wie bei ADO.NET Classic, die Transaktion noch explizit in die Eigenschaft Transaction schreiben. Wenn ich das nicht mache, bekomme ich einfach einen Fehler. Das heißt, ich habe die Möglichkeit, hier, nachdem die Transaktion begonnen wurde, dieses Statement auszuführen. Das ist ein DELETE-Statement. Dann kann ich eine zweite Abfrage ausführen, die vielleicht etwas völlig anderes tut, die auch nicht das gleiche Command-Objekt benutzt, sondern ein eigenes. Auch das erzeuge ich mit CreateCommand, übergebe hier entsprechend die Transaktion und kann dann sozusagen innerhalb dieser Transaktion die Abfrage durchführen. Ganz zum Schluss habe ich die Möglichkeit, die Transaktion freizugeben. Genauer gesagt, nicht nur die Möglichkeit, ich habe eigentlich sogar die Pflicht, die Transaktion freizugeben Das bedeutet, wenn ich mir das ganze Konstrukt anschaue, beginnt hier meine Transaction, das heißt, das ist die entsprechende Klammer. Folge ich der Linie nach unten, sehe ich, dass ich da unten lande. Und es bedeutet: Wenn ich die Transaktion nicht freigebe, kein Commit durchführe, wird automatisch ein Rollback durchgeführt. Wenn ich also hingehe und zum Beispiel hier eine kleine Modifikation durchführe, sage, ich möchte nur 100 löschen, damit es nicht so lang dauert, dann kann ich zum Beispiel hingehen und entsprechend die Transaktion an der Stelle, ich zeige Ihnen, welche Möglichkeiten Sie haben, auch zurückrollen. Die Regel lautet aber: Wenn kein Commit durchgeführt ist, bedeutet das automatisch ein Rollback. Das heißt, das kann ich mir sparen für Fälle, wo ich hingehe und entsprechend einfach das Commit sein lasse an der Stelle. Dann rufe ich die Funktion oben auf. Und lasse das Ganze geschwind ausführen. Sie sehen, die letzten drei Ziffern, 395. Dann kann ich das schließen. Nehmen wir den Breakpoint da raus. Das Ganze nochmal laufen lassen. Es sind immer noch 395, weil ich lösche 100, die Transaktion schwebt aber noch, sie ist weder freigegeben, noch wurde sie zurückgerollt. Wenn ich das bis zum Schluss nicht getan habe, dann wird sie wirklich mit einem Rollback auf dem Server entsprechend wieder negiert. Ich kann jetzt dafür hingehen und dieses Commit einfügen. Das nochmal laufen lassen. Jetzt sollten es keine 395 mehr sein, zumindest im zweiten Anlauf nicht. Ich habe erst gelöscht, dann die Zeilenanzahl gelesen, also müssten es jetzt 295 sein. Und sind es auch. Das heißt, da können Sie relativ leicht mit Transactions arbeiten an der Stelle, indem Sie einfach hier im using-Block eine Transaktion beginnen, die so lange leben lassen, wie sie entsprechend benötigt wird, und zum Schluss bitte das Commit nicht vergessen. Oder wenn es nicht anders geht und Sie wirklich die Datenänderung nicht haben wollen, können Sie natürlich auch explizit ein Rollback durchführen. Aber das ist in vielen Fällen einfach nicht notwendig. Das bedeutet nämlich zum Beispiel auch: Wenn ich in diesem Block einen Fehler habe, angenommen hier tritt ein Fehler auf, weil das übergebene Statement ungültig ist, dann wird der Transaction-Block, das heißt der using-Block, der die Transaction umschließt, so oder so verlassen, ohne dass ich an der Stelle in irgendeiner Form etwas tun muss. Es wird einfach kein Commit ausgeführt. Das ist eine recht einfache und recht elegante Weise.

Datenzugriff mit ADO.NET und .NET Core

Lernen Sie, wie mit Ihrer .NET Core-Anwendung auf relationale Datenbanken wie z.B. SQL Server oder SQLite zugreifen.

2 Std. 49 min (28 Videos)
Derzeit sind keine Feedbacks vorhanden...
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:12.04.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!