"Jaime Casanova" <[email protected]>:
> 2009/6/15 Mariano Reingart <[email protected]>:
>>
>> 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 1: para suscribirte y desuscribirte, visita 
http://archives.postgresql.org/pgsql-es-ayuda

Responder a