![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: BDE
Deadlocks, was tun ? (FB 1.5)
Guten Tag,
ich habe ein paar fragen zum Thema Deadlocks... Ich habe 2 Stored Procedures in einem Projekt, diese greifen jeweils auf 2 (die gleichen) Tabellen zu. Die Prozeduren machen um Prinziep nichts anderes als ein Select und 2 Updates, werden allerdings in regelmäßigen abständen aufgerufen, ergo häufig benutzt. Das kann auch eine ganze Weile lang gut gehn, blos irgendwann bekomme ich eine Fehlermedlung "Deadlock". Das wirfst meine ganze Clientkette durcheinander und sorgt für unordnung in jeglichen clients sowie in der Datenbank, außerdem geht eine Weile erstmal nichts mehr (Die 10 sec. Deadlocktime). Meine eigentliche Frage ist, gibt es eine möglichkeit diesen Deadlock zu verhindern ? Aufbau der Stored Procedures Prozedur 1 Select Tabelle A Update Tabelle A Update Tabelle B Prozedur 2 Select Tabelle B Update tabelle B Update Tabelle A Ich habe auch schon veruscht in den Prozeduren die Befehlsfolge zu tauschen, jedoch ohne Erfolg. Vielen Dank im Vorraus MfG Sascha Lütkemeier |
Re: Deadlocks, was tun ? (FB 1.5)
Etwas Code wäre u.U. hilfreich
|
Re: Deadlocks, was tun ? (FB 1.5)
OK, hier ist erstmal der Code einer Stored Procedure und der Aufruf aus Delphi, hoffe das bringt euch was, aber ich bin auch für Ideen offen, mit denen ich generell Deadlocks vermeiden kann ;-).
SQL-Code:
Die 2. SP sieht ziemlich genauso aus, nur dass die angesprochene Tabelle immer genau die andere ist und hier der Versprochene Aufruf:
begin
Select count(*) from t_swpoolstr into kcount; update t_auftraege set Kundenname = 'Test1', Auftragsnr = kcount, Liefertermin = '28.03.2008 17:22:30', Datumuhrzeit = '27.03.2008 18:30:22', Status = 1 where ID = 380; update t_swpoolstr set PositionenID = kcount, Poolstr = 'TestString 1', Status = 1 where ID = 118.417; suspend; end
Delphi-Quellcode:
procedure TForm1.btn_execspClick(Sender: TObject);
begin If DataBase1.InTransaction = False Then DataBase1.StartTransaction; Try Begin DataSource1.DataSet:= StoredProc1; StoredProc1.StoredProcName:= ed_storedp.Text; StoredProc1.ExecProc; Database1.Commit; end; Except Database1.Rollback; ShowMessage('Ausführung nicht möglich, Fehler !'); Timer2.Enabled:= false; End; end; |
Re: Deadlocks, was tun ? (FB 1.5)
Ich würde die Spalte PositionenID streichen. da hier nur eine Redundanz erzeugt wird.
Zudem verstehe ich nicht ganz was hier gemacht wird. Du erzeugst aus der Anzahl von Datensätzen einer Tabelle eine Auftragsnummer? |
Re: Deadlocks, was tun ? (FB 1.5)
Das ist eine Analogi, ich musste mir schnell etwas machen um dne Ernstfall zu simulieren, was da genau passiert ist unwichtig, nur, dass in einer solchen konstellation auf die Datenbanken zugegriffen wird, und hierbei ein Deadlock entsteht, der muss aber irgendwie weck, da er Probleme macht...
|
Re: Deadlocks, was tun ? (FB 1.5)
-Datensatz explizit locken
-Select for update -Logik überprüfen |
Re: Deadlocks, was tun ? (FB 1.5)
Ich bin ziemlicher neuling, verstehe also nicht ganz, was du damit meinst bzw. wie ich einen Datensatz zum Beispiel expliziet locke... :?
|
Re: Deadlocks, was tun ? (FB 1.5)
Wenn du einen Datensatz lockst, dann kann er von keinem anderen mehr geöffnet werden.
|
Re: Deadlocks, was tun ? (FB 1.5)
Dass ist mir schon klar, die frage war eher wie ich so etwas mache, und was du mit den anderen Punkten meinst ^^
MfG Sascha |
Re: Deadlocks, was tun ? (FB 1.5)
-Bei einem select for update wird der Datensatz automatisch gesperrt.
-U.U. kann man die Logik der Abfrage oder die Datenbankstruktur so anpassen, dass die Gefahr von Deadlocks minimiert wird. Aber ohne die Abfragen, DB-Struktur zu kennen, kann man da nichts Näheres sagen. ![]() ![]() ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 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 by Thomas Breitkreuz