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