Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Deadlockopfer bei TDataset.Refresh (https://www.delphipraxis.net/210820-deadlockopfer-bei-tdataset-refresh.html)

haentschman 15. Jun 2022 13:51

Datenbank: MSSQL • Version: 2017 • Zugriff über: FireDAC

Deadlockopfer bei TDataset.Refresh
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallöle...8-)

Wie kann ein lesender "Vorgang" (Refresh) einen Deadlock auslösen? :gruebel:

Habe ich was verpaßt? :wink: Ist das wieder ein MSSQL Ding?

Info:
laufende Replikation

Danke

mkinzler 15. Jun 2022 13:53

AW: Deadlockopfer bei TDataset.Refresh
 
Was macht das DataSet?

mjustin 15. Jun 2022 14:01

AW: Deadlockopfer bei TDataset.Refresh
 
An einem Deadlock sind zwei Transaktionen beteiligt. Das Lesen ist nicht mehr erlaubt, da die Daten zwischenzeitlich geändert wurden ...

(so interpretiere ich die Meldung)

haentschman 15. Jun 2022 14:14

AW: Deadlockopfer bei TDataset.Refresh
 
Zitat:

Was macht das DataSet?
Eine Datenmenge die nur zum Lesen da ist, aktualisieren.
Delphi-Quellcode:
procedure TDMED.FDQAdrAfterPost(DataSet: TDataSet);
begin
  dmRepositories.EdRepoExtLookupAdr.Properties.DataController.DataSet.Refresh;
end;
Hilft "CanRefresh" da weiter? Die Hilfe dazu ist dürftig. Ich hoffe, daß das das macht was draufsteht. :wink:
Delphi-Quellcode:
procedure TDMED.FDQAdrAfterPost(DataSet: TDataSet);
var
  Data: TDataSet;
begin
  Data := dmRepositories.EdRepoExtLookupAdr.Properties.DataController.DataSet;
  if Data.CanRefresh then
  begin
    Data.Refresh;
  end;
end;

Jasocul 15. Jun 2022 14:21

AW: Deadlockopfer bei TDataset.Refresh
 
Sicher, dass es nicht das "Post" davor ist, dass den Deadlock auslöst?

TigerLilly 15. Jun 2022 14:38

AW: Deadlockopfer bei TDataset.Refresh
 
Der MSSQL Server lockt beim Lesen. Je nach zu lesender Datenmenge, Last am Server etc kann das Locking von einem Row Lock bis zu einem Table Lock eskalieren (lock escalation).

Das hat mit Transaktionen beim Schreiben nochnicht mal was zu tun.

https://www.sqlshack.com/locking-sql-server/
https://www.mssqltips.com/sql-server...-and-blocking/

jobo 15. Jun 2022 17:25

AW: Deadlockopfer bei TDataset.Refresh
 
Lock Escalation ist ziemlich ätzend bei MSSQL. Aber man muss sagen, das geschieht nicht aus Spaß oder gar Boshaftigkeit, sondern in "Notlagen".
Wenn Lock Escalation eintritt, würde man dem Server wohl anmerken, dass er "Atemnot" hat (außer er ist gut aus dem Blick weg virtualisiert)

Ein Refresh würde m.E. auch kein Lock verursachen oder auslösen, eher würde ein Wait stattfinden, bis commitete Daten vorliegen. (aber ich hab damit schon ewig nichts mehr gemacht, also unsicher)

Frage wäre, ob das Refresh ein (interner) Teil eines Post ist. Es gibt ja diese Mechnismen, die nachschauen, ob noch alles seine Ordnung hat.
Also vor dem wirklichen Post vergleichen, ob die Daten, die vor dem Edit geholt wurden, auch noch so vorhanden sind. (Damit nicht die Änderungen eines anderen überschrieben werden, ohne dass es bemerkt wird.)
Die SQL Variante davon ist in D oder anderen Umgebungen sowas wie:
Update <meineTabelle> set <irgendwelcheFelder> = <irgendwelcheWert> where id=<schlüsselwert> and <alleFelder>=<alleVorigenWerte>

Bernhard Geyer 15. Jun 2022 18:11

AW: Deadlockopfer bei TDataset.Refresh
 
Beim MS SQL Server muss man auf DB-Ebene die richtige Einstellung machen, damit er nicht bescheuerte Locks beim Lesen setzt.
Geht seit der 7er Version, ist aber Standardmäßig deaktiviert.

haentschman 16. Jun 2022 05:40

AW: Deadlockopfer bei TDataset.Refresh
 
Danke für die vielen Infos...:thumb:
Zitat:

Der MSSQL Server lockt beim Lesen
:wall:

Zitat:

Beim MS SQL Server muss man auf DB-Ebene die richtige Einstellung machen, damit er nicht bescheuerte Locks beim Lesen setzt.
Kannst du mir die Einstellung sagen? Was, wo?

Zitat:

Sicher, dass es nicht das "Post" davor ist, dass den Deadlock auslöst?
Ich habe ein eigenes "System" was die doppelte Speicherung "verhindert" (eigene Lock Tabelle). Leider ist das auf die betroffene Tabelle noch nicht ausgeweitet. :? Deshalb kann ich es nicht ausschließen. Aber das Refresh wird im "AfterPost" ausgelöst...das sollte das Post fertig sein. :zwinker:

TigerLilly 16. Jun 2022 08:38

AW: Deadlockopfer bei TDataset.Refresh
 
Zitat:

Zitat von haentschman (Beitrag 1507407)
Danke für die vielen Infos...:thumb:
Zitat:

Der MSSQL Server lockt beim Lesen
:wall:

Das Locken beim Lesen ist schon sinnvoll. Wer das nicht will, kann mit WITH (NOLOCK) lesen + daran denken, was uU passieren kann. Das Problem bei der Eskalation ist, dass Sätze gesperrt werden, die mit der ursprünglichen Anforderung nichts zu tun haben und nur zufällig auf der gleichen Page (oder in derselben Tabelle) liegen.

haentschman 16. Jun 2022 09:21

AW: Deadlockopfer bei TDataset.Refresh
 
Zitat:

Wer das nicht will, kann mit WITH (NOLOCK) lesen
...ich werde mir jetzt bei den "ReadOnly" Datenmengen das WITH NOLOCK mal ausprobieren.

Code:
SET LOCK_TIMEOUT
...ist das eine Möglichkeit?
Nachtrag: mal auf 1000 gesetzt. Warten wir auf den nächsten Fehler...:stupid:

mjustin 17. Jun 2022 10:19

AW: Deadlockopfer bei TDataset.Refresh
 
So ein Zufall: heute ist mir dieser "Deadlockopfer"-Fall (ebenfalls MS SQL) begegnet.

Code:
Die Transaktion (Prozess-ID 790) befand sich auf Sperre Ressourcen aufgrund eines anderen Prozesses in einer Deadlocksituation und wurde als Deadlockopfer ausgewählt. Führen Sie die Transaktion erneut aus.
bzw.

Code:
Die Transaktion (Prozess-ID 871) befand sich auf Sperre | Kommunikationspuffer Ressourcen aufgrund eines anderen Prozesses in einer Deadlocksituation und wurde als Deadlockopfer ausgewählt. Führen Sie die Transaktion erneut aus.; nested exception is java.sql.SQLException: Die Transaktion (Prozess-ID 871) befand sich auf Sperre | Kommunikationspuffer Ressourcen aufgrund eines anderen Prozesses in einer Deadlocksituation und wurde als Deadlockopfer ausgewählt. Führen Sie die Transaktion erneut aus.
Danke an die Beitragenden, eventuell kann ich später auch etwas beisteuern.

haentschman 29. Jul 2022 06:51

AW: Deadlockopfer bei TDataset.Refresh
 
Moin...8-)

Update:
Delphi-Quellcode:
procedure TDMED.FDQAdrAfterPost(DataSet: TDataSet);
var
  Data: TDataSet;
begin
  Data := dmRepositories.EdRepoExtLookupAdr.Properties.DataController.DataSet;
  if Data.CanRefresh then
  begin
    Data.Refresh;
  end;
end;
...hat nicht funktioniert. :?

Delphi-Quellcode:
procedure TDMED.FDQAdrAfterPost(DataSet: TDataSet);
begin
  repeat
    Sleep(100);
  until not TFDQuery(DataSet).Connection.InTransaction;

  dmRepositories.EdRepoExtLookupAdr.Properties.DataController.DataSet.Refresh;
end;
...das hat bis dato keinen Deadlock mehr ausgelöst. :thumb:

Da ich das an mehreren Stellen habe mache ich mir eine function in meinen Tools...:thumb:

himitsu 29. Jul 2022 10:38

AW: Deadlockopfer bei TDataset.Refresh
 
Dann solltest du aber kein BeginTransaction in deinem Code haben, weil dann dieser Code hängen bleibt, weil diese Tansaction nicht nach dem Post automatisch beendet wird.

haentschman 2. Aug 2022 08:08

AW: Deadlockopfer bei TDataset.Refresh
 
Moin...

genervte Grüße...:? Kaum redet man drüber geht es nicht mehr.
Zitat:

exception class : EMSSQLNativeException
exception message : [FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 11.0][SQL Server]Die Transaktion (Prozess-ID 9515) befand sich auf Sperre Ressourcen aufgrund eines anderen Prozesses in einer Deadlocksituation und wurde als Deadlockopfer ausgewählt. Führen Sie die Transaktion erneut aus.
Wie kriege ich raus wer der Übeltäter ist? :gruebel:
Zitat:

aufgrund eines anderen Prozesses
@himitsu:
Logisch...:zwinker: Ich habe noch eine Abbruchbedingung mit drin...(Anzahl Versuche)

himitsu 2. Aug 2022 12:40

AW: Deadlockopfer bei TDataset.Refresh
 
wie rausfinden, wer noch läuft und an wem es dann wohl hängen könnte:

https://stackoverflow.com/questions/...er-connections

TigerLilly 2. Aug 2022 12:53

AW: Deadlockopfer bei TDataset.Refresh
 
Zitat:

Zitat von haentschman (Beitrag 1509645)
Wie kriege ich raus wer der Übeltäter ist?

Lass den Profiler mitlaufen, dann siehst du, welche SQL Statements abgesetzt werden.
Und vielleicht hilft das auch:
http://etutorials.org/SQL/...

haentschman 2. Aug 2022 13:22

AW: Deadlockopfer bei TDataset.Refresh
 
Zitat:

Wie kriege ich raus wer der Übeltäter ist?
Blöd ausgedrückt. :wink:
...ist mir eigentlich egal. Ich brauche eine Prüfung ob das Refresh ausgeführt werden kann. :?

Was ich probiert habe:

Query.Connection.InTransaction
Connection.InTransaction (was imho das gleiche ist)
Query.CanRefresh

Welche Möglichkeiten habe ich noch?

PS:
Das ist erst, seit ich das automatische Aktualisieren der Oberfäche eingebaut habe. Dadurch hat die Häufigkeit der Ausführung des Refresh deutlich zugenommen. :roll:

Zitat:

Lass den Profiler mitlaufen, dann siehst du, welche SQL Statements abgesetzt werden.
Da sehe ich doch nur welche Locks existieren. Aber nicht die "Konflikte" mit einem Refresh. :gruebel:
Trotzdem Danke.

TigerLilly 2. Aug 2022 13:27

AW: Deadlockopfer bei TDataset.Refresh
 
Das hat mit Transaktionen nur bedingt zu tun. Dein Problem sind LOCKs + die werden auch durch bloßes Lesen erzeugt. Die Locks können neben einzelnen ROWs auch ganze Seiten oder Tabellen umfassen + damit Sätze sperren, die mit der aktuellen Abfrage gar nichts zu tun haben. Siehe weiter vorne im Thread.

haentschman 2. Aug 2022 13:44

AW: Deadlockopfer bei TDataset.Refresh
 
Zitat:

Das hat mit Transaktionen nur bedingt zu tun. Dein Problem sind LOCKs
:oops: ich brauche Urlaub.

Ich kann um das Refresh einen leeren try/except Block machen. :duck:

TigerLilly 2. Aug 2022 13:49

AW: Deadlockopfer bei TDataset.Refresh
 
Zitat:

Zitat von haentschman (Beitrag 1509660)
Ich kann um das Refresh einen leeren try/except Block machen.

Du kannst eine Schleife machen + das Refresh - nach einer kleinen Pause - solange wiederholen, bis es klappt. Aber da muss man sehr aufpassen, dass man den Server nicht mit lauter Wiederholungsversuchen in die Knie zwingt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 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