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;


Rispondi quotando