Controlando la duración de las esperas de bloqueo de PostgreSQL

Tengo una mesa llamadadeposits

Cuando se realiza un depósito, la tabla está bloqueada, por lo que la consulta se ve algo así como:

SELECT * FROM deposits WHERE id=123 FOR UPDATE

AsumoFOR UPDATE está bloqueando la tabla para que podamos manipularla sin otro hilo pisando fuerte en los datos.

Sin embargo, el problema ocurre cuando otros depósitos intentan obtener el bloqueo de la tabla. Lo que sucede es que, en algún lugar entre el bloqueo de la mesa y la llamadapsql_commit() algo está fallando y manteniendo la cerradura para unaestúpidamente largo tiempo. Hay un par de cosas que necesito ayuda para abordar:

Las consultas posteriores que intentan obtener el bloqueo deberían fallar, he intentado lograr esto conNOWAIT pero preferiría un método de tiempo de espera (porque puede estar bien esperar, simplemente no esperar por una 'cantidad de tiempo estúpida')

Idealmente, me gustaría descartar esto en el pase y tener mi consulta inicial solo mantener el bloqueo durante un cierto tiempo, ¿es esto posible con postgresql?

¿Hay alguna otra función mágica que pueda agregar a la consulta (similar a NOWAIT) que solo esperará el bloqueo durante 4 segundos antes de fallar?

Debido a la naturaleza del código de espaguetis dolorosamente monolítico del código base, no es simplemente una cuestión de cambiar las configuraciones globales, sino que debe ser una solución basada en la consulta.

Gracias por su ayuda, chicos, seguiré hurgando pero no he tenido mucha suerte. Es esta una función no existente de psql, porque encontré esto:http://www.postgresql.org/message-id/[email protected]

Respuestas a la pregunta(1)

Su respuesta a la pregunta