AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Deadlock

Ein Thema von olaf · begonnen am 22. Dez 2011 · letzter Beitrag vom 22. Dez 2011
Antwort Antwort
olaf

Registriert seit: 4. Mai 2009
Ort: Iserlohn
82 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Deadlock

  Alt 22. Dez 2011, 08:44
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Hallo,
ich bekomme bei einem gleichzeitigen Zugriff im Netzwerk immer einen Deadlock. Warum werden die Transactionen nicht hintereinander abgearbeitet ober wie kann ich den Ablauf der Transactionen steuern. Ich habe auch schon, wie in der Hilfe von IBDAC beschrieben, vor dem Starten der Transaction den Zustand abgefragt und dann ein commit oder rollback ausgeführt; wie:

Delphi-Quellcode:
If tra=active then
Tra.commit;
Isolationlevel snapshot brachte auch keinen Erfolg.

Muß ich einen anderen Isolatinlevel wählen. Wie behandelt Ihr gleichzeitige Zugriffe. Irgendetwas muß ich grundsätzlich falsch machen. Es liegt bestimmt nicht an Firebird.



Wäre für eure Hilfe sehr dankbar.
Olaf

Die stored procedure rufe ich so auf:

Delphi-Quellcode:
procedure TNetzwerk.setvorname;
var
 spex: TIBCStoredProc;
 tra: TIBCTransaction;
begin
 try
 tra:=TIBCTransaction.Create(dm);
 tra.DefaultConnection:=dm.ConMtermin;
 tra.DefaultCloseAction:=taRollback;
 tra.IsolationLevel:=iblReadCommitted;

 spex:=TIBCStoredProc.Create(dm);
 spex.Transaction:=tra;
 spex.Connection:=dm.ConMtermin;
 tra.StartTransaction;
  spex.StoredProcName:='INS_UPD_VORNAMEBUCHEN';
  spex.Prepare;
  spex.ParamByName('NA').value:=trim(buchenFR.AdvEdit2.Text);
  spex.ParamByName('GES').value:=buchenFR.dialoggeschlecht;
  spex.Execute;
 tra.Commit;
 finally
 spex.UnPrepare;
 spex.Free;
 tra.free;
 end;
end;


Die SP:

DECLARE ANZ INTEGER;
BEGIN
BEGIN

SELECT COUNT(NAME) as ANZAHL
FROM VORNAME
WHERE NAME = :NA
INTO :ANZ;

IF (ANZ=0) THEN
BEGIN
INSERT INTO VORNAME(NAME, GESCHLECHT)
VALUES( :NA, :GES);
END
ELSE
BEGIN
UPDATE VORNAME SET
GESCHLECHT = :GES
WHERE VORNAME.NAME = :NA;
END

END
END
  Mit Zitat antworten Zitat
Benutzerbild von MGC
MGC

Registriert seit: 15. Mai 2008
Ort: Helsa
106 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Deadlock

  Alt 22. Dez 2011, 09:54
Hallo,

drei kurze Fragen:

1. Ist das IBDAC nicht nur für Interbase? Du verwendest ja Firebird.
2. Wird ggf. die Transaction über spex automatisch beim Aufruf der stored Procedure gestartet und Du bekommst einen Fehler weil Du es zwischendrin nochmals manuel startest?
3. Oder solltest Du die Transaction starten nachdem Du die stored Procedure aufgerufen hast, bzw. ruft Deine Transaction die Procedure selbst auf?

Ich werde aus Deinem Code nicht ganz schlau.

EDIT: Habs gerade nochmal nachgelesen, das IBDAC ist auch für Firebird...
Marc
Programmieren ist wie Chemie:
1. Wenn man alles einfach nur zusammenschmeisst kommt es zu unerwarteten Reaktionen.
2. Wenn es plötzlich anfängt zu qualmen, muss man eben noch mal von vorn anfangen.

Geändert von MGC (22. Dez 2011 um 09:56 Uhr)
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#3

AW: Deadlock

  Alt 22. Dez 2011, 10:04
Deadlocks (obwohl es eigentlich keine wirklichen Deadlocks sind) treten in der Regel auf, wenn zwei konkurrierende Transaktionen den selben Datensatz schreibend ändern möchten. Kann das bei dir der Fall sein?

Isolation-Level kommt drauf an, welche Konsistenzanforderungen du bzgl. Ergebnismenge hast. Grundsätzlich gilt die Regel, dass sich lesende und schreibende Operationen auf den selben Datensatz nicht sperren, außer man verwendet bei ReadCommitted NO_REC_VERSION für die Transaktion. Weiss nicht was da IBDAC standardmäßig nimmt, aber ich vermute mal REC_VERSION bei ReadCommitted, was ok wäre.

Ich würde auch sagen, dass dein Exception-Handling nicht sauber. Bei dir sollte es etwas in Richtung wie folgt sein:

Delphi-Quellcode:
tra:=TIBCTransaction.Create(dm);
spex:=TIBCStoredProc.Create(dm);
try
  try
    -- Do stuff
    tra.Commit;
  except
    tra.Rollback;
    raise; // Optional
  end;
finally
  spex.Free;
  tra.Free;
end;

Auch deine SP bzgl. dem SELECT COUNT(*) könnte bremsen, abhängig davon, wieviele Datensätze in der Ergebnismenge sind. Für einen "Existenz-Check" kann/sollte man immer IF(EXISTS(...)) THEN verwenden.
  Mit Zitat antworten Zitat
olaf

Registriert seit: 4. Mai 2009
Ort: Iserlohn
82 Beiträge
 
RAD-Studio 2009 Pro
 
#4

AW: Deadlock

  Alt 22. Dez 2011, 11:05
Hallo,

habe ich auch schon vermutet MGC.
das automatische commit habe ich jetzt ausgeschaltet, sowohl für die Verbindung als auch für den Aufruf der SP, hat aber nichts genützt.


Guter Tip (If(exist..) und bei IBDAC ist REC_Version eingestellt.

olaf
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#5

AW: Deadlock

  Alt 22. Dez 2011, 12:20
Wennst du eine Transaktion explizit startest, dann sollte ein aktivierter AutoCommit Modus für die Zeitdauer bis zum Commit/Rollback eh deaktiviert sein. Da du 2.5 einsetzt, kannst du ganz einfach ein MERGE bzw. UPDATE OR INSERT verwenden, aber das wird vermutlich nicht dein Problem lösen, aber prinzipiell ist hier eine SP nicht notwendig, wenn es darum geht, ein INSERT oder UPDATE zu machen.

Welche Exception bekommst du denn genau?

Btw, wir könnten uns das auch gezielter via z.B. TeamViewer ansehen, aber das Ganze wäre dann nicht mehr kostenlos. Bei Interesse/Bedarf einfach via Skype kontaktieren (thomas.steinmaurer)

Wir können auch gerne hier eine Diskussion weiterführen. Dauert halt länger ...
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Deadlock

  Alt 22. Dez 2011, 12:33
Zum Thema SPs:

Es gibt auch sogenannte EXECUTE BLOCKs. Das sind quasi "SPs für zwischendurch".
Sollte man sich auf jeden Fall mal anschauen. Einige Sachen kann man damit sehr
schön und vor allem schnell lösen ohne extra eine SP schreiben zu müssen:

http://www.firebirdsql.org/refdocs/l...execblock.html
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
olaf

Registriert seit: 4. Mai 2009
Ort: Iserlohn
82 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: Deadlock

  Alt 22. Dez 2011, 12:38
Hallo,

die Exception lautet:
Log conflict on no wait transaction deadlog update conflicts with concurrent update concurrent transaction nr 33691

olaf
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#8

AW: Deadlock

  Alt 22. Dez 2011, 12:47
Olaf,

dann geh mit dieser TransactionID in die Monitoring-Tabellen, dann wirst du hoffentlich sehen, welche konkurrierenden Updates sich blockieren.
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#9

AW: Deadlock

  Alt 22. Dez 2011, 12:57
Diese 'no wait' transaction ist doch kein Problem. Jedenfalls ist das kein Deadlock.
Das soll sogar so sein. Normalerweise wartet eine Transaktion, bis sie an der Reihe ist (außer eben: Deadlock). Eine 'no wait' Transaktion bricht sofort ab. Dafür sind sie im normalfall wesentlich schneller.

Abhilfe: Nochmal versuchen oder die 'no wait'Option ausschalten
  Mit Zitat antworten Zitat
olaf

Registriert seit: 4. Mai 2009
Ort: Iserlohn
82 Beiträge
 
RAD-Studio 2009 Pro
 
#10

AW: Deadlock

  Alt 22. Dez 2011, 14:44
Hallo,

ich habe die no_wait option rausgenommen. Jetzt bekomme ich keine Fehlermeldung mehr.

olaf
  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 13:22 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