Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1648to1652
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

SQL-DB-Abfrage deadlock abfangen

SQL-DB-Abfrage deadlock abfangen
02.10.2018 15:12:01
Joni
Hallo,
ich frage per VBA von einer MSSQL-Datenbank Daten ab. In ganz seltenen Fällen kann es zu einem Deadlock kommen. Das würde ich jetzt gerne abfangen und dann das Select nochmal ausführen. Da ich das Deadlock nicht reproduzieren kann meine Frage, ob mir jemand mit einem Beispielcode weiter helfen kann.
Danke für eure Hilfe.
Gruß Joni

Dim cConnection As New ADODB.Connection, rsRecordSet As New ADODB.Recordset
Dim sDBServer As String, sDB as String, sQuery as String
cConnection.CommandTimeout = 0 'Timeout ausschalten
cConnection.ConnectionTimeout = 0
cConnection.Open "Provider=SQLOLEDB;Data Source=" & sDBServer & ";Initial Catalog=" & sDB & "; _
Integrated Security=SSPI;"
rsRecordSet.Open sQuery, cConnection, adOpenForwardOnly, adLockReadOnly
cConnection.Close
Set rsRecordSet = Nothing
Set cConnection = Nothing

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Einen Deadlock kann man nicht abfangen...
02.10.2018 22:13:43
EtoPHG
Hallo Joni,
Zu einem Deadlock kann es nur kommen, wenn 2 voneinander unabhängige Instanzen 2 verschiedenen DB-Resourcen in verschiedener Richtung beanspruchen. Ich frage mich warum du das Zitat: ich frage per VBA von einer MSSQL-Datenbank Daten ab mit eine adLockReadOnly machst. Veränderst du die Daten nach dem Lesen? Dann wär es wohl nicht mir 'nur abfragen'. Und welche zweite Instanz möchte aus der gleichen DB-Resource diese Daten auch Lesen und ggf. verändern?
Gruess Hansueli
Fehler Deadlock abfangen
03.10.2018 09:36:39
Joni
Hallo Hansueli,
ich verwende den Code nicht für Selects, im konkreten Fall ist es aber nur ein Select.
Zudem habe in meinen Tests festgestellt, dass mit adLockReadOnly die Selects schneller sind, weshalb ich jetzt immer diese Einstellung verwende.
Dass ich den Deadlock nicht verhindern kann ist klar (kommt ja vom DB-Server) ich würde aber gerne den Fehler erkennen und im Falle eines Deadlocks das Query nochmal ausführen. Ich habe das jetzt über einen ErrorHandler wie folgt gelöst. Bei meinem "Test-Fehler" hat es auf jeden Fall funktionert.
Danke für deinen Input. Wenn du noch etwas zum Thema adLockReadOnly ergänzen möchtest, gerne :-).
Gruß Joni
errHandler:
iErrCounter = iErrCounter + 1
Debug.Print ERR.Number & " | " & ERR.Description
If InStr(1, LCase(ERR.Description), LCase("Deadlock")) > 0 And iErrCounter 

Anzeige
Falsches Verständnis von DB-Behavior...
03.10.2018 09:52:26
DB-Behavior...
Hallo Joni,
1. Schön, dass du den 'Fehler' in den Griff bekommen hast.
2. Zu deinem Zitat: 'dass mit adLockReadOnly die Selects schneller sind, weshalb ich jetzt immer diese Einstellung verwende.'- In vielen produktiven DB-Umgebungen würdest du mit einem solchen Programmiervorgehen bestraft, wenn nicht ausgeschlossen, werden. Performance-Messungen in DB-Server Umgebungen sind sehr heikel und schwierig. Das Lesen mit Locking 'generell' schneller ist als ohne Locking ist rein logisch nicht möglich, denn der Server muss ich zusätzlich intern merken, was gesperrt werden soll. Wenn du also sicher bist, dass du nur Lesen willst, lass den Lock in Zukunft weg und vergiss das einmal festgestellte Verhalten, dass es mit Lock mal schneller war!
Gruess Hansueli
Anzeige
Danke für die Aufklärung oT
03.10.2018 09:56:04
Joni

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige