Jump to content

Query mit Status "Suspended" löst Blockierungen aus


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo Zusammen,

 

ich bin noch sehr unerfahren was den Ms SQL Server angeht und hoffe ihr könnt mir helfen:

 

Wir nutzen normalerweise den Advantage Database Server und wollen unsere Anwendung jetzt ebenfalls auf einem Ms SQL Server laufen lassen. Wir nutzen Delphi als Entwicklungs-Tool und wollen FireDAC nutzen, um sowohl den Advantage Database Server als auch den Ms SQL Server anzusteuern.

Dazu haben wir ein bestehendes kleineres Projekt angepasst und können soweit auch mit FireDAC und dem Ms SQL Server arbeiten. Es kommt jedoch immer wieder zu dem Problem, dass ein User sich selbst blockiert. Dies ist jedoch nicht immer reproduzierbar, sondern tritt wohl nur in besonderen Situationen auf, die ich noch nicht weiter einschränken konnte.

Die Tabellen-Struktur ist dabei folgende:

Es gibt eine Tabelle "ToDo" in der verschiedene Aufgaben enthalten sind. Diese Aufgaben können verschiedenen Mitarbeitern zugeordnet werden, so dass ein Mitarbeiter z.B. 75 Aufgaben hat. Zu jeder Aufgabe können Kommentare geschrieben werden, Tabelle "ToDoNotes".

 

Das Programm läuft soweit erstmal problemlos, nur im Laufe des Tages kann es dann dazu kommen, dass ein Mitarbeiter zu einem ToDo ein Kommentar schreiben möchte und sobald er diesen speichert friert das Programm ein und im Ms SQL Aktivitätsmonitor sieht man, dass das SQL zum Speichern durch ein anderes SQL des gleichen Mitarbeiters blockiert wird. Hier hilft es dann nur noch den Mitarbeiter vom Server zu kicken und er muss seinen Kommentar erneut schreiben. Dies klappt dann ohne Probleme.

 

In meinen Beobachtungen im Laufe der Zeit konnte ich feststellen, dass die Probleme vermehrt auftreten, wenn der Benutzer eine Übersicht über seine ToDos offen hat. Diese Übersicht führt ein Query aus "SELECT * FROM ToDo WHERE Mitarbeiter = xy". Es werden somit ggf. 75 Datensätze für den Mitarbeiter angezeigt. In dem Zusammenhang ist mir dann aufgefallen, dass Mitarbeiter mit mehr als 50 Datensätzen in ihrer Übersicht, im Aktivitätsmonitor ein Query stehen hatten, dass den Status "Suspended" gezeigt hat. Kann mir jemand mit seinen Worten erklären was genau dieses Suspended bedeutet bzw. ob vermieden werden sollte solche Query zu haben?

 

Ich bin aufgrund des Suspended nämlich auf die Option "FetchMode" für FireDac gestoßen und bei FireDAC ist es so, dass im Standard immer nur 50 Datensätze abgerufen werden. Wähle ich hier 500 und öffne die Übersicht für den Mitarbeiter mit 75 Datensätzen, so bekomme ich auch kein Query mit Status "Suspended" mehr. Da wir aber zum Teil auch andere Query haben, haben wir nun die Option "FetchAll" als "FetchMode" gewählt. Ist das eine gängige Lösung für Ms SQL? Ist es erforderlich, dass immer alle Datensätze zum Client übertragen werden?

 

Vielen Dank schonmal für jegliche Art von Feedback :D

 

Gruß Markus

Link zu diesem Kommentar

Ich kenne "FireDAC" nicht. Eventuell halten Deine Selects ein Resutsets in einem ungeeigneten  Isolation Mode offen. Resultsets sollten auch irgendwann geschlossen werden, Denkbar ist auch, dass bei beim "Scrollen" durch das Resultset eine neue Query ausgeführt wird, also ein weiteres Resultset geöffnet wird. Das Problem müsste der Entwickler lösen.

Link zu diesem Kommentar

Danke für dein Feedback Zahni.

Das Thema Isolation Mode sagt mir leider noch nichts, muss ich mich mal mit beschäftigen.

Ich habe mir den Aktivitätsmonitor während des Scrollens angeschaut und konnte kein weiteres Query entdecken was ausgeführt wird. Auch wenn gar nicht gescrollt wird, ist weiterhin nur das eine Query mit Status "Suspended" zu sehen. Ich könnte mir vorstellen, dass hier tatsächlich das Query noch offen bleibt, wenn nur 50 Datensätze abgerufen werden anstatt die kompletten 75.

 

Ist es denn beim Arbeiten mit dem Ms SQL Server Standard immer alle Datensätze abzurufen? Ich kenne es nur vom ADS und dort wird nie ein FetchAll ausgeführt...

Link zu diesem Kommentar

Schau mal hier

https://msdn.microsoft.com/de-de/library/ms173763(v=SQL.120).aspx

 

Nein, es müssen von einem Resultset nicht alle Zeilen abgerufen werden. Es kann mit einem sog. Cursor offen gehalten werden - muss aber auch irgendwann geschlossen werden.

Die Queries mit dem Status "Suspended" werden auf eine Lock-Freigabe warten, der von einer anderen Query gesetzt wurde. 

 

Schau auch mal hier rein:

 

https://technet.microsoft.com/de-de/library/ms178104(v=SQL.105).aspx

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...