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 20:56:17
Message-ID: 4A3806F1.20207@terra.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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" <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 21:04:51 Re: Bloqueo en registro-tabla
Previous Message Alvaro Herrera 2009-06-16 20:51:09 Re: Bloqueo en registro-tabla