Re: Sobre pg_advisory_locks

From: Oswaldo Hernández <listas(at)soft-com(dot)es>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Sobre pg_advisory_locks
Date: 2010-03-16 16:18:42
Message-ID: 4B9FAF62.7030508@soft-com.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Alvaro Herrera escribió:
> Oswaldo Hernández escribió:
>
>> 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?
>
> No. Tus suposiciones son peligrosas. Podrías usar
> pg_advisory_lock(int8) pero entonces no tendrías acceso a poner el OID
> de la tabla. Creo que lo más sano sería no usar un id_registro int8;
> ¿no te alcanza con los cuatro mil millones de identificadores que provee
> int4?
>

La cuestión es que mis id de registro no son normales, simplificando
avanzan de 100 en 100, entonces en rango se reduce a 42 millones. Esa es
la causa de querer aprovechar ese byte. Lo meditaré a ver que solución tomo.

>
>> 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?
>
> No. Los candados de pg_advisory están en un espacio de locks separado
> de los locks de sistema. Lo que sí puede pasar es que en un año más
> agregues otros candados "advisory" que no quieras liberar. Te
> recomendaría no usar unlock_all si puedes evitarlo.
>

OK. He hecho una función que lee la tabla pg_locks, obtiene los advisory
del pid actual y los desbloquea uno a uno, reservando un rango para
otros posibles usos.

Gracias Alvaro.

--
Oswaldo Hernández

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2010-03-16 16:27:17 Re: Sobre pg_advisory_locks
Previous Message Miguel Angel Hernandez Moreno 2010-03-16 15:58:47 no encuentro pg_ctlcluster