Re: Bloqueo en registro-tabla

From: "Mariano Reingart" <mariano(at)nsis(dot)com(dot)ar>
To: "suso" <jlcubas(at)terra(dot)es>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Bloqueo en registro-tabla
Date: 2009-06-16 21:04:51
Message-ID: 60840.190.17.205.33.1245186291.squirrel@www.nsis.com.ar
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

Si, yo creo que con esos dos puntos te alcanza

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

Si, yo no compararía contra la IP (por si el médico se equivocó y abrió
dos sesiones del sistema), simplemente con el xmin creo que alcanza.

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

Suerte !

Sds
Mariano

>>
>> 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 suso 2009-06-16 21:07:34 Re: Bloqueo en registro-tabla
Previous Message suso 2009-06-16 20:56:17 Re: Bloqueo en registro-tabla