Thema: Deadlock

Einzelnen Beitrag anzeigen

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