![]() |
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 |
AW: Deadlockopfer bei TDataset.Refresh
Was macht das DataSet?
|
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) |
AW: Deadlockopfer bei TDataset.Refresh
Zitat:
Delphi-Quellcode:
Hilft "CanRefresh" da weiter? Die Hilfe dazu ist dürftig. Ich hoffe, daß das das macht was draufsteht. :wink:
procedure TDMED.FDQAdrAfterPost(DataSet: TDataSet);
begin dmRepositories.EdRepoExtLookupAdr.Properties.DataController.DataSet.Refresh; end;
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; |
AW: Deadlockopfer bei TDataset.Refresh
Sicher, dass es nicht das "Post" davor ist, dass den Deadlock auslöst?
|
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. ![]() ![]() |
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> |
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. |
AW: Deadlockopfer bei TDataset.Refresh
Danke für die vielen Infos...:thumb:
Zitat:
Zitat:
Zitat:
|
AW: Deadlockopfer bei TDataset.Refresh
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz