Re: Bloqueo en registro-tabla

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

"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 Cesar Erices 2009-06-16 14:12:16 OT... Alguien a instalado drupal 6.12 con postgres 8.3
Previous Message Gilberto Castillo Martínez 2009-06-16 12:44:25 Re: [OT] evento desde un checkbox