PDA

Visualizza la versione completa : [DELPHI] Gestione dei deadlock con Firebird


Whitecrowsrain
13-08-2009, 11:04
Salve a tutti,
allora il problema questo :
ho un appplicativo che riceve degli ordini e li scrive all'interno del DB.
Ora ad ogni ordine da un numero interno e quindi ha bisogno di accedere in maniera esclusiva alla tabella del numeratore.

Il problema si crea quando ho due linee e quindi due applicativi che ricevono ordini da due linee diverse ma che scrivono gli ordini nello stesso database.
Pi in specifico succede che se l'applicativo A inizia una transazione bloccando la tabella dei numeratori e subito dobo l'applicativo B comincia la transazione per la stessa tabella prima che A abbia fatto la commit, quando l'applicativo A fa la commit l'applicativo B va in errore segnalando errore di deadlock.

Ora io ho risolto creando un ciclo che termina solo quando si riesce a fare la commit e cmq scrivendo dentro una tabella di controllo ogni qual volta c' un errore di deadlock.

Di certo questa non la soluzione migliore e quindi chiedevo a voi come potevo risolvere meglio la problematica.

Grazie






var
eseguito:boolean;
...
eseguito:=false;
repeat
try
db.startTransation;
qry.sql.text:='UPDATE NUMERATORE SET NUMERO=NUMERO+1' ;
qry.execSQL;
.... //qui tutte le varie operazioni successive
db.commit;
eseguito:=true;

except
on e:exception do
begin
db.rollback;
qry.sql.text:='INSERT INTO CONTROLLO (:id,:ora,:data,:errore)';
..
qry.paramtersByName('errore').asString:=e.message;
qry.execSQL;
end;
end;
until eseguito;

Loading