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
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

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:)

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 7: no olvides aumentar la configuración del "free space map"

Responder a