Delphi-PRAXiS
Seite 1 von 3  1 23      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 Uhr.
Seite 1 von 3  1 23      

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