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.
Este sistema me está sobrepasando por lo que veo:(
Un saludo
Suso

"Jaime Casanova" <[email protected]>:
2009/6/15 Mariano Reingart <[email protected]>:
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 [email protected])

Responder a