"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
