AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Deadlockopfer bei TDataset.Refresh
Thema durchsuchen
Ansicht
Themen-Optionen

Deadlockopfer bei TDataset.Refresh

Ein Thema von haentschman · begonnen am 15. Jun 2022 · letzter Beitrag vom 2. Aug 2022
Antwort Antwort
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.341 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Deadlockopfer bei TDataset.Refresh

  Alt 15. Jun 2022, 14:21
Sicher, dass es nicht das "Post" davor ist, dass den Deadlock auslöst?
Peter
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.179 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Deadlockopfer bei TDataset.Refresh

  Alt 15. Jun 2022, 14:38
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/
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Deadlockopfer bei TDataset.Refresh

  Alt 15. Jun 2022, 17:25
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>
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Deadlockopfer bei TDataset.Refresh

  Alt 15. Jun 2022, 18:11
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.303 Beiträge
 
Delphi 12 Athens
 
#5

AW: Deadlockopfer bei TDataset.Refresh

  Alt 16. Jun 2022, 05:40
Danke für die vielen Infos...
Zitat:
Der MSSQL Server lockt beim Lesen


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.
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.179 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Deadlockopfer bei TDataset.Refresh

  Alt 16. Jun 2022, 08:38
Danke für die vielen Infos...
Zitat:
Der MSSQL Server lockt beim Lesen
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.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.303 Beiträge
 
Delphi 12 Athens
 
#7

AW: Deadlockopfer bei TDataset.Refresh

  Alt 16. Jun 2022, 09:21
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...

Geändert von haentschman (16. Jun 2022 um 09:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.303 Beiträge
 
Delphi 12 Athens
 
#8

AW: Deadlockopfer bei TDataset.Refresh

  Alt 29. Jul 2022, 06:51
Moin...

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.

Da ich das an mehreren Stellen habe mache ich mir eine function in meinen Tools...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05: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