Laden...

ADO2.8 Anzahl der Commands innerhalb einer Transaction

Letzter Beitrag vor 9 Jahren 7 Posts 2.117 Views
ADO2.8 Anzahl der Commands innerhalb einer Transaction

verwendetes Datenbanksystem: <SqlServer2005>

Hallo Gemeinde,

wieviele Commands kann ich innerhalb einer Connection nach BeginTrans ausführen bevor ich ein Commit oder einen Rollback machen muss?

Vielen Dank und viele Grüße

Jürgen

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

Hallo,

du kannst theoretisch unendlich viele Befehle innerhalb einer Transaktion absetzen. Beschränkt wird es nur durch den SQL Server falls, das Transaktionsprotokoll auf eine bestimmte Größe beschränkt ist, oder bis kein Plattenplatz zur Verfügung steht*. Beachten musst du natürlich, das innerhalb einer Transaktion locks entstehen, die ggf. die DB lahmlegen können. Gerade wenn es eine sehr lange Transaktion ist. Auch können andere Clients neben den locks auch auf Timeouts laufen. Aus dem Grund sollte jede Transaktion immer so kurz wie möglich abgehandelt werden. Was hast du im konkreten Fall vor?

Gruß
Khalid

*Das kann man im Tech-Net nachlesen. Denn das Ganze ist im Detail natürlich etwas komplizierter.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Wenn du von ADO2.8 redest, meinst du das du den OldDb Provider benutzt?

Hallo Khalid, FZelle,

auf dem Server ist kein Transactionlog aktiviert(nicht meine Zuständigkeit).

Ich muss einen Master- und viele Detail-Datensätze "gleichzeitig" abspeichern.
Um keine Inkonsistenzen in die Datenbank zu bringen will ich jedoch die Commands alle in eine Transaktion packen und einen Rollback durchführen sobald ein Fehler auftritt oder die Anzahl der betroffenen Zeilen(x) (Command.Execute x) gleich 0 (null nicht NULL) ist.

Viele Grüße

Jürgen

PS.
@ FZelle: Arbite nicht mit ADO.NET, sondern ADO2.8(OLEDB) unter VBA

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

Ob jetzt ADO.NET oder ADO2.8 für OLEDB macht in dem konkreten Fall meiner Meinung nach kein Unterschied. Wie gesagt, es ist kein Problem in einer Transaktion 1 Million Inserts zu machen. Die Frage ist nur, wie reagieren die anderen Clients. Ein Insert in eine Tabelle erzeugt ein Table Lock*. D.h. in dieser Zeit warten alle anderen Connections bis der lock aufgelöst wurde. Wenn der Insert jetzt 10min dauert, blockierst du 10min lang alle anderen Connections. Ob das jetzt stört, kannst nur du sagen 😃.

Das Transaktionsprotokoll ist vermutlich nicht ausgeschaltet. Sonst würde gar nichts mehr gehen. Denn alles außer DML Statements sind über Transaktionen gewrappt, wenn nicht angegeben. Das hat mit ADO.NET oder Bla nichts zu tun, sondern ist SQL Server Sache.

Deine Eingangsfrage lässt sich an sich ziemlich einfach beantworten: Probier es aus 😃

*Auch hier ist es im Detail wieder etwas komplizierter. Ggf. lösen die Inserts auch kein lock aus. Das hängt stark von der Struktur ab. Auch lösen im Regelfall nur 2-3 Inserts kein lock aus. Erst ab einer bestimmten Menge. Aber auch dies ist alles im Tech-Net beschrieben.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Das Transaktionsprotokoll ist vermutlich nicht ausgeschaltet. Sonst würde gar nichts mehr gehen. Er meint wahrscheinlich das Nachfahren des Logs bei einer Wiederherstellung. (Einfaches Wiederherstellungsmodell)

Transaktionen so kurz wie möglich, das vermindert lange Wartezeiten der anderen Clients und reduziert Dead Locks.

Beim "Einfachen Wiederherstellungsmodell" kann man natürlich auch Transaktionen benutzen.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3