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.
Edit 2: Titel etwas passender gemacht.