Re: Bloqueo en registro-tabla

From: "Mariano Reingart" <mariano(at)nsis(dot)com(dot)ar>
To: "suso" <jlcubas(at)terra(dot)es>
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 19:51:51
Message-ID: 60472.200.123.112.2.1245181911.squirrel@www.nsis.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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.

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.

> Este sistema me está sobrepasando por lo que veo:(

Suele pasar, pero es un lindo desafio :)

Sds
Mariano

> 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
>>
>>
>>
>
> --
> TIP 2: puedes desuscribirte de todas las listas simultáneamente
> (envía "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Mariano Reingart 2009-06-16 20:02:37 Re: Bloqueo en registro-tabla
Previous Message Emanuel Calvo Franco 2009-06-16 19:36:45 Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] acentos y ñ