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




codice:
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;