Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Automatische Transaktionen SQL Server 2005 verhindern? (https://www.delphipraxis.net/101669-automatische-transaktionen-sql-server-2005-verhindern.html)

Phoenix 17. Okt 2007 07:55

Datenbank: Microsoft SQL Server • Version: 2005 • Zugriff über: ADO, alternativ Corelabs SDAC

Automatische Transaktionen SQL Server 2005 verhindern?
 
Folgendes Problem:

Eine Anwendung läuft einwandfrei auf SQL Server 2000.
Die gleiche Anwendung auf SQL Server 2005 läuft reproduzierbar in Deadlocks.

Hintergrund: Es werden in eine Tabelle mehrere Datensätze eingefügt. Nach dem Einfügen werden einige Daten neu geladen - unter anderem wird auch ein Select auf die geänderte Tabelle gefeuert. Beim SQL Server 2000 erhält dieses Statement die neu eingefügten Datensätze und alles ist wunderbar. Beim SQL Server 2005 bleibt das Statement jedoch wegen eines nicht commiteten Inserts (das letzte Statement der eingefügten Datensätze) in einem Lock auf der Tabelle hängen.

Erster Ansatz: Implicit Transactions sind auf dem Server ausgeschaltet.
Diese Einstellung hat jedoch keinen Einfluss - sowohl wenn es an als auch aus ist gehts nicht.

Bei ADO ist Autocommit an.
Bei SDAC gibt es gar kein Autocommit.

Das Problem tritt sowohl bei ADO als auch bei SDAC-Verbindungen auf.

Setze ich Manuell ein Commit nach den Inserts ab funktioniert der Teil. Schliesse ich dann jedoch das Formular auf dem diese Änderungen gemacht wurden wird die Verbindung geschlossen - und dann erhalte ich eine Exception von der Datenbank, dass die Verbindung trotz einer offenen Transaktion geschlossen wurde und diese Transaktion automatisch gerollbacked wurde.

Es scheint also, als würde der Server trotz anders lautender Einstellungen implizite Transaktionen für jede Verbindung starten.

Was kann man da machen? Ich bin echt am Ende mit meinem Latein :-(

Ps: Die Gleiche Anwendung funktioniert so wie sie ist auf Oracle, auf Access (JET Engine) auf SQL Server 2000 und auf ASTA-Servern. Nur bei SQL Server 2005 tritt dieses Phänomen auf. Es kann also eigentlich nur an den Datenbankeinstellungen liegen.

Edit Nachtrag:
Ich setze jetzt nach dem Öffnen der Verbindung sogar noch explizit ein 'SET IMPLICIT_TRANSACTIONS OFF' ab. Auch das hilft nicht, es scheint definitiv noch eine offene Transaktion zu geben. Interessant ist: Connection.InTransaction ist false. Die Transaktion scheint also wirklich von der DB zu kommen. :wall:

Edit 2: Titel etwas passender gemacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz