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.