autom. interner ROLLBACK von Transaktionen?

23/04/2008 - 14:33 von Anonymous | Report spam
Hallo NG!

Unsere .NET-Anwendung greift über ADODB (ActiveX, kein .NET) auf den
SQL Server (2005) zu. Für "umfangreichere" Aktionen erfolgt eine
explizite Transaktionssteuerung ...

pADODBConnection.Execute("BEGIN TRANSACTION")
[Code]
pADODBRecordset.Update()
[Code]
pADODBConnection.Execute("COMMIT TRANSACTION")


Dabei kommt es - sporadisch - zu dem Fehler "Die COMMIT TRANSACTION
hat keine entsprechende BEGIN TRANSACTION". Allerdings können wir
einfach nicht zurückverfolgen, worauf dies zurückzuführen ist.

Wenn "logische" Fehler festgestellt werden, dann wird innerhalb von
"[Code]" natürlich "ROLLBACK TRANSACTION" aufgerufen, aber das ist in
den Fàllen, in denen der Fehler auftritt, nicht der Fall!
In den Fehlerfàllen liefert "SELECT @@TRANCOUNT" unmittelbar vor dem
COMMIT auch noch 1, also so als ob alles in Ordnung wàre.

Beendet der SQL Server ggf. auch "auf eigene Faust" Transaktionen ohne
den verbundenen Client darüber zu informieren?

Gibt es eine Möglichkeit (Tabellen, Systemsichten) "solche"
TA-Rollbacks ausfindig zu machen um der Ursache auf den Grund zu
gehen?

Mit freundlichen Grüßen
Daniel Barisch
 

Lesen sie die antworten

#1 Elmar Boye
24/04/2008 - 19:24 | Warnen spam
Hallo Daniel,

Daniel Barisch schrieb:
Unsere .NET-Anwendung greift über ADODB (ActiveX, kein .NET) auf den
SQL Server (2005) zu. Für "umfangreichere" Aktionen erfolgt eine
explizite Transaktionssteuerung ...

pADODBConnection.Execute("BEGIN TRANSACTION")
[Code]
pADODBRecordset.Update()
[Code]
pADODBConnection.Execute("COMMIT TRANSACTION")


Dabei kommt es - sporadisch - zu dem Fehler "Die COMMIT TRANSACTION
hat keine entsprechende BEGIN TRANSACTION". Allerdings können wir
einfach nicht zurückverfolgen, worauf dies zurückzuführen ist.



Ein bisschen habt ihr euch das Leben schwer gemacht, als ihr
ADODB verwendet habt. Der OleDb Client wàre da sinnvoller.
Denn dort kriegt ihr den Fehler ohne Zwischenschicht via OleDbException.

Ein COMMIT sollte bei möglichen Fehlern in der Form
IF @@TRANCOUNT > 0 COMMIT
ausgeführt werden.
Wenn ihr bei ADODB bleiben wollt, solltet ihr die Transaktion
über die Transaktionsmethoden des Connection Objekts einleiten.


Wenn "logische" Fehler festgestellt werden, dann wird innerhalb von
"[Code]" natürlich "ROLLBACK TRANSACTION" aufgerufen, aber das ist in
den Fàllen, in denen der Fehler auftritt, nicht der Fall!
In den Fehlerfàllen liefert "SELECT @@TRANCOUNT" unmittelbar vor dem
COMMIT auch noch 1, also so als ob alles in Ordnung wàre.

Beendet der SQL Server ggf. auch "auf eigene Faust" Transaktionen ohne
den verbundenen Client darüber zu informieren?



Tut er bei SET XACT_ABORT ON oder sehr schwerwiegenden Fehlern
(Ressourcenproblem etc.)
Auf jeden Fall wird in solchen Fàllen @@ERROR gesetzt und
üblicherweise im Client abgeliefert.
Bei ADODB verwendet wàre das die Errors-Auflistung.

Gruß Elmar

Ähnliche fragen