|
Hola:
Desde hace mucho tiempo se ha discutido un método para eviotar que mas de una
persona use un usuario autorizado concurrentemente.
El metodo comun es marcar un campo en la tabla de usuarios, pero eso produce
problemas si el programa termina anormalmente.
La idea mia es en el brazo principal de la aplicación,hacer SELECT FOR UPDATE en
el caso de SQL o RLOCK() en el caso de DBASE, y tratar de escribir. si no se
puede , el usuario esta ocupado, si se puede, no hacer commit ni liberar el
usuario sino al fin de la aplicacion.
El metodo lo he probado con MySQL y funciona, salvo qUe demora mucho haciendo
los intentos cuando el usuario esta ocupado.
oUsua:=sqlselect{'select * from '+ARC_USUA+' where Usuario="'+fU+'" FOR
update',oConn }
IF oUsua:reccount=0
oWin:oDCStatusMLE:ADDOK("Usted no esta autorizado a usar el Sistema
usuario:"+fu,.f.)
oUsua:close()
lCierro:=1=2
RETURN FALSE
ENDIF
BEGIN SEQUENCE
oUsuatest:=sqlstatement{'update cgdma07 set co_rreo="lolo" where
cu1="+fU',oConn}
oUsuatest:execute()
//NO SE HACE EL COMMIT
BREAK
RECOVER
IF oUsuatest:STATUS<>NULL_OBJECT
oWin:oDCStatusMLE:ADDOK("Ya hay una instancia de este
usuario:"+fu,.f.)
lCierro:=1=2
ENDIF
END
Entre otras cosas, no comprendo muy bien la clausula Begin sequence al aplicarla
a una secuencia en la cual en varios metodos se actualizan tablas, como en el
caso de facturacion.
Yo he optado por hacer un solo COMMIT en el brazo principal que llama al
proceso, pero no me parece muy tecnico.Los ejemplos de la guia de usuario no me
funcionan presumiblemente por la no definicion de algunas variables globales no
esoecificadas por los ejemplos.
Gracias
Edgardo Solano
|