Delphi-PRAXiS
Seite 2 von 3     12 3      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 Uhr.
Seite 2 von 3     12 3      

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