Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - Transactionscope, für 1 Transaktion mit mehreren Connections
Vegeto - Do 10.10.13 08:28
Titel: Transactionscope, für 1 Transaktion mit mehreren Connections
Hallo,
nachdem ich hier schon sehr gute Hilfe bekomen habe:
Transaktionen in C# [
http://www.entwickler-ecke.de/topic_112124.html].
Bin ich heute wieder an einem Problem angekommen :/ Denn wenn man eine Transaktion auf mehrere Connection benutzen will muss man mit Transactionscope arbeiten.
Ich habe einwenig im Internet nachgesehen und habe mein Code danach umgebaut, jetzt habe ich solch ein Codegerüst:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| using (TransactionScope tranScope = new TransactionScope()) { --> tranScope.Complete(); } |
In jeden verwende ich using-Blöcke und Try-Catch-Blöcke, sobald ein Fehler ausgelöst wird soll eine Messagebox aufspringen was der Fehler war. Ich habe mit Absicht einen Fehler beim hinzufügen eingebaut um zu sehen was passiert, natürlich gibt er mir ein Fehler auf und die ganzen Befehle(queries) werden nicht durchgeführt, doch nachdem abgefangenen Fehler kommt es zu einem weiteren Fehler:
Der Vorgang ist für den Status der Transaktion ungültig.
Und er verweist auf eine Zeile im ersten INSERT(pfeil) auf Connection.Open();
Ich weiß echt nicht mehr weiter ich hoffe ihr könnt mir helfen.
LG
DANKE schonmal für das Durchlesen
Moderiert von
Th69: Beitragsformatierung überarbeitet.
Vegeto - Do 10.10.13 09:20
Hallo Th69,
das Problem ist denke ich damit verbunden, dass wenn ich um den DataReader und Command ein Try-Catch block habe und sobald das Programm in ein Fehler läuft zeigt er den Fehler an und arbeitet weiter und schon damit ist ja die Transaktion abgebrochen und durch wieder verbinden zeigt er mir den Fehler an.
Doch du hast recht ich mach es mal mit einem throw im Catch block.
DANKE für den Gedankenstoß.
lg
edit:
Ich habe jetzt um tranScope.Complete() ein try-catch gemacht trotzdem kommt es zum fehler.
ich habe in jeden catch block ein throw eingefügt und dennoch kommt es zum Fehler :( :( :(
immer beim nächsten connection.open(kommt der fehler).
Ralf Jansen - Do 10.10.13 09:49
Du solltest den Code zeigen dann verstehen wir das vielleicht.
So kann ich nur vermuten das du das mit den catch Blöcken verbastelt hast. Es macht für micht keinen Sinn mehr als einen zu haben eben den um die gesamte Transaktion herum.
Und b.) verwechselst du vielleicht das Verhalten von Commit bei einer Transaktion mit dem Verhalten eines Complete bei einem TransactionScope. Ein Complete macht keinen Commit! Es markiert den Scope nur damit dieser wenn er disposed wird (also am Ende des using Blocks des TransactionScopes) einen Rollback oder einen Complete auf alle beteiligten Transaktionen macht.
Vegeto - Do 10.10.13 10:12
Hallo Ralf Jansen,
der Code ist ziemlich Lang (ca 500 Zeilen), doch wenn Ihr das wollte Poste ich ihn?
Aber das was du unter b.) gesagt hast hört sich Interessant an.
Das heißt es kommt zu keinem commit?
Ich bin auf diesen Gebiet wirklicher anfänger :/
Aber ich frage mal anders:
Wie würdest du es lösen, wenn eine Tabelle in einer Datenbank zuerst Gelöscht werden soll dann sollen zwei Insert-Queries durchgearbeitet werden mit DataReader und noch einmel Command für das einfügen per Parameter, danach soll die neuen Datensätze Aktualisiert werden, hier wird auch mittel Reader die Datensätze in variablen gesteckt dann bearbeitet und mittels Command und Parametern geupdated.
Und es werden immer verschiedene Connection benutzt.
Ich denke hier muss ein TransactionScope benutzt werden, doch leider schaffe ich das nicht richtig. :'(
Bin irgendwie am verzweifeln :(
Lg
Danke trotzdem an euch beide :)
EDIT:
So habe jetzt wie du gesagt hast nur eine try-catch gemacht ins Try ein Complete() und ins Catch ein Dispose(). Jetzt passiert auch ein RollBack(oder besser gesagt nichts mit der Tabelle, wenn es zum Fehler kommt).
DANKE DANKE DANKE
Lg
Ralf Jansen - Do 10.10.13 10:43
Zitat: |
Und es werden immer verschiedene Connection benutzt.
Ich denke hier muss ein TransactionScope benutzt werden, doch leider schaffe ich das nicht richtig. :'( |
Hier würde ich eingreifen und sagen deine Prämisse, verschiedene Connections zu benutzen, ist ein/das Problem.
Nimn eine Connection. Wenn du jetzt sagst "Aufgrund von einem bestimmten Anwendungsdesign muß das so sein" würde ich antworten "Da liegt dann ein schwerer Designfehler vor" ;)
Verschieden Connections (in einer Transaktion) sollten nur nötig sein wenn verschiedenen Datenbanken in einer Transaktion zusammengefasst werden sollen. Das ist eigentlich auch der einzige sinnvolle Einsatzzweck eines TransaktionScope. Wenn alles in einer DB passiert machst du es aus irgendeinem Grund zu kompliziert.
Vegeto - Fr 11.10.13 10:08
Hallo Ralf Jansen,
Danke für deine Antwort :)
Ich denke auch das die mehreren Connections das problem ist.
Zu deinem letzten satz, im moment passiert alles auf einem Server doch zu einem späterem Zeitpunkt müssen die Daten aus einem anderem Server geholt werden, deswegen die verschiedenen Connection.
Dennoch danke ich dir Sehr :)
Lg
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!