Base de coneixement
ADS Anàlisi/Disseny de Soft, S.L.U.

Enviar a un amigo
* Su nombre:
* Su email:
* Email de su amigo:
Comentario:


Evitar bloqueigs i deadlocks durant la execució de stored precedures

Problema:

Aquest canvis son necesaris degut a que utilitzem els controladors ODBC de firebird v 2.0.0.148, aquesta versio i les posteriors tenen un bug que fa que no es produiexi el commit despres d'executar un stored procedure. Fins ara per evitar aquest problema cridavem el procediments amb un select * from nomdelprocediement, pero tot i aixi no acababa de funcionar al 100%.

Exemple:

lcsql = [select * from procediment(?param1,?param2)]
x=sqlexec(Thisform.nconexio, lcsql, "tmpcurs")
If x<1
 Thisform.errodbc(Message(),"UPD")
 Return 0
Endif

* Tambe es aplicable a la utilitzacio del metode alternatiu de crida del procediment:

lcsql = [execute procedure procediment(?param1,?param2)]

Si executem aquest codi i el procediement efectua canvis a la base de dades (inserts,deletes,updates), aquest canvis no serán grabats (COMMIT) fins que ho fem explicitament nosaltes. Aquest comportament provoca que es produeixin deadlocks als altres terminals que volen llegir/actualitzar les dadades que encara no han set grabades.

nota: El procediments que es criden dintre d'una transacció manual no es veuen afectats per aquest problema ja que nosaltres efectuem el commit o rollbak al final de proces.

aux = SQLSETPROP(ThisForm.nConexio,'Transactions',2)
lcsql = [select * from procediment(?param1,?param2]
x=sqlexec(Thisform.nconexio, lcsql, "tmpcurs")
If x<1
   aux = SQLROLLBACK(ThisForm.nConexio) 
   Thisform.errodbc(Message(),"UPD")
ELSE
   aux = SQLCOMMIT(ThisForm.nConexio) 
Endif

aux = SQLSETPROP(ThisForm.nConexio,'Transactions',1)

Solució:

Per evitar aquest problema haurem d'afegir la instruccio commit al final de la crida del procediment, exemple:

lcsql = [select * from procediment(?param1,?param2)]
x=sqlexec(Thisform.nconexio, lcsql, "tmpcurs")
If x<1
     Thisform.errodbc(Message(),"UPD")
     Return 0
Else
      x=sqlexec(Thisform.nconexio, "COMMIT")
Endif

 

 

 

 




RSS