Hola,

En ciertos casos donde hacer 'select .. for update' genera un bloqueo demasiado fuerte estoy utilizando las funciones pg_advisory_lock, pero se me plantean las siguientes dudas:

1.
Si para 'marcar' un registro en uso utilizo:
  pg_try_advisory_lock(oid_de_tabla, id_registro)

me puedo encontrar en un futuro que el id_registro (bigint) supera la capacidad del int4.

De momento estoy parcheando la situación, robandole un byte al oid de la tabla (asumo que el oid de tabla nunca sobrepasará 16.777.215), y asignándoselo al id de registro con la siguiente formula:
  pg_try_advisory_lock( (oid_de_tabla::int8 << 40) + id_registro )

Pero, ¿hay alguna forma de obtener un id único, tipo bigint, que identifique un registro de forma global?

2.
En algunos momentos utilizo pg_advisory_unlock_all() para asegurarme que no queda ningún advisory lock pendiente de liberar.

La duda es que si, al igual que postgres genera locks automaticamente al realizar select, etc. ¿puede postgres utilizar también advisory_locks y entonces anularlos yo indebidamente al ejecutar pg_advisory_unlock_all?

Gracias
--
Oswaldo Hernández
--
TIP 5: ¿Has leído nuestro extenso FAQ?
        http://www.postgresql.org/docs/faqs.FAQ.html

Responder a