> Parece que mas o menos esta solucionado el tema, a ver si me aclaro: > 1 - un bloqueo lógico, incluyendo fecha-hora, IP del medico, esta ip > puede servir tambien si en caso de estar blqoueada la tabla, saber por > que médico es, y asi, también, en caso de cualquier tema, poder pedir > "responsabilidades", aunque algusno de estos datos, lo va a llevar en la > auditoria > 2 comparar xmin
Si, yo creo que con esos dos puntos te alcanza >> Suso: >>> Hola Mariano, lo que se me ocurre, hacer un blqueo como sugieres, con >>> "x" minutos en la hora del server, cuando otra persona(médico o data >>> manager) entra a ese mismo paciente, sea por la razón que sea, mire s >>> está bloqueado, y si es así, la hora del bloqueo, si ha pasado la >>> hora(los minutos), y sigue bloqueado, es decir, el médico apagó >>> directamente el pc o se le bloqueó, etc, pues desbloquearlo sobre la >>> marcha, no sé si es correcto. >>> Ya me diréis como lo veis. >> >> A mi me parece lo más simple (comparar la fecha y/o desbloquear sobre la >> marcha), pero tené en cuenta que si el médico vuelve, podría estar >> sobreescribiendo la fila pensando que todavía tiene el bloqueo. >> > Esto se soluciona con el xmin y/o también comparando la ip de la persona > que lo bloqueó, y en función de eso, obrar en consecuencia Si, yo no compararía contra la IP (por si el médico se equivocó y abrió dos sesiones del sistema), simplemente con el xmin creo que alcanza. >> Por eso te recomendaba guardate también el xmin original, para que en el >> momento de hacer el commit, compararlo y poder detectar si otro decidió >> cambiar los datos a pesar del bloqueo. > OK >> >>> Este sistema me está sobrepasando por lo que veo:( >> >> Suele pasar, pero es un lindo desafio :) > A mi me ha pasado casi desde el prinicpio que empeze a programa, soy > autodidacta, a base de libros, pedir consejo(como es el caso), u busaca > que te bsuca por internet:) > desde luego:) Suerte ! Sds Mariano >> >> Sds >> Mariano >> > Gracias > UN slaudo > Suso >>> Un saludo >>> Suso >>> >>>> "Jaime Casanova" <jcasa...@systemguards.com.ec>: >>>>> 2009/6/15 Mariano Reingart <mari...@nsis.com.ar>: >>>>>> Al empezar, haces: >>>>>> SELECT *, xmin FROM historia_clinica WHERE numero=1234; >>>>>> -- guardas el xmin y empieza la edición (por ej, en variable xmin0) >>>>>> >>>>>> -- al guardar, comienzo una transacción >>>>>> BEGIN; >>>>>> -- selecciono el xmin actual y bloqueo la tabla para que otro no >>>>>> pueda >>>>>> modificar ese registro >>>>>> SELECT xmin FROM historia_clinica WHERE numero=1234 FOR UPDATE; >>>>>> -- si xmin != xmin0 lanzar un error porque los datos se modificaron >>>>>> (ROLLBACK) >>>>>> -- si xmin == xmin0, hacer el UPDATE y COMMIT >>>>>> >>>>> [...] >>>>>> BEGIN; >>>>>> SELECT fecha_bloqueo+CAST('24 hours' AS INTERVAL)<now() AS bloqueado >>>>>> FROM >>>>>> historia_clinica WHERE numero=1234 FOR UPDATE; >>>>>> -- si bloqueado es TRUE, todavia no paso el periodo de 24hs), hacer >>>>>> ROLLBACK >>>>>> e informar al usuario que el registro esta bloqueado. >>>>>> -- si bloqueado es NULL o falso (por ej., pasaron 24hs), pones una >>>>>> nueva >>>>>> fecha de bloqueo (que comienza ahora): >>>>>> UPDATE historia_clinica SET fecha_bloqueo=now() WHERE numero=1234; >>>>>> COMMIT; >>>>>> >>>>> para que usas el xmin en este enredo? >>>>> solo necesitas grabar la fecha y al menos el usuario (y quizá la ip >>>>> de >>>>> la máquina cliente) >>>>> >>>> El xmin lo proponía para detectar si la fila habia cambiado, como es >>>> un >>>> bloqueo lógico y no físico. >>>> Igualmente la solucion del trigger me parece mejor pero más >>>> complicada, >>>> como comente en el mail, y viendolo me parece demasiado para este >>>> problema. >>>> >>>> Para solucionar el tema si el médico se va y no desbloquea, se podría >>>> implementar algun mecanismo de señales con LISTEN y NOTIFY para >>>> detectar >>>> si el bloqueo sigue vigente o no. >>>> >>>> Sds >>>> >>>> Mariano >>>> >>>> >>>> >>> -- >>> TIP 2: puedes desuscribirte de todas las listas simultáneamente >>> (envía "unregister TuDirecciónDeCorreo" a majord...@postgresql.org) >>> >> >> >> > > -- TIP 2: puedes desuscribirte de todas las listas simultáneamente (envía "unregister TuDirecciónDeCorreo" a majord...@postgresql.org)