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
Seite 1 von 3  1 23      
Benutzerbild von haentschman
haentschman

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

Deadlockopfer bei TDataset.Refresh

  Alt 15. Jun 2022, 13:51
Datenbank: MSSQL • Version: 2017 • Zugriff über: FireDAC
Hallöle...

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

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

Info:
laufende Replikation

Danke
Miniaturansicht angehängter Grafiken
deadlockopfer.png  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Deadlockopfer bei TDataset.Refresh

  Alt 15. Jun 2022, 13:53
Was macht das DataSet?
Markus Kinzler
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Deadlockopfer bei TDataset.Refresh

  Alt 15. Jun 2022, 14:01
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)
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: Deadlockopfer bei TDataset.Refresh

  Alt 15. Jun 2022, 14:14
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.
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;
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

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

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.174 Beiträge
 
Delphi 11 Alexandria
 
#6

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
 
#7

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
 
#8

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.296 Beiträge
 
Delphi 12 Athens
 
#9

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.174 Beiträge
 
Delphi 11 Alexandria
 
#10

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
Antwort Antwort
Seite 1 von 3  1 23      


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 12:32 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