Re: Bloqueo en registro-tabla

From: suso <jlcubas(at)terra(dot)es>
To: Mariano Reingart <mariano(at)nsis(dot)com(dot)ar>
Cc: Jaime Casanova <jcasanov(at)systemguards(dot)com(dot)ec>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Bloqueo en registro-tabla
Date: 2009-06-16 16:58:31
Message-ID: 4A37CF37.3000807@terra.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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" <jcasanov(at)systemguards(dot)com(dot)ec>:
>> 2009/6/15 Mariano Reingart <mariano(at)nsis(dot)com(dot)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
>
>
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message suso 2009-06-16 17:00:57 Re: Bloqueo en registro-tabla
Previous Message Sergio Gabriel Rodriguez 2009-06-16 16:44:30 Re: pg_restore: no restaura indices ni triggers