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