Contexto:
Básicamente, tengo un script de mantenimiento en segundo plano que se ejecuta a través de una entrada pg_cron. Realiza inserciones y actualizaciones y, por lo tanto, tiene el potencial de bloquear tablas/filas algunas veces. Esta secuencia de comandos tiene una prioridad baja en comparación con el resto de la demanda mayoritariamente leída en la base de datos.
Pregunta:
En un nivel alto, me gustaría saber si hay algo que pueda hacer para que cada vez que el script de mantenimiento haga algo para bloquear una lectura, detenga lo que está haciendo y salga del camino. Similar a cómo funciona AUTOVACUUM.
Ejemplo:
Como ejemplo, estoy imaginando una variable SESSION que establece que la tolerancia del tiempo de bloqueo sea muy pequeña pero que hace que el comando lockING falle en lugar del comando bloqueado. Aquí es donde entra el concepto de prioridad. No puedo encontrar nada que exista como esto.
¿O tal vez hay otra forma de lograr esto que logre el mismo objetivo final?
No, no existe tal configuración que haga que el comando de bloqueo falle en lugar del bloqueado. Una forma de evitarlo sería mantener la transacción pequeña, de modo que no se bloqueen muchas filas a la vez, y no durante períodos prolongados. Tal vez podría hacer que t apague synchronous_commit en la sesión, para evitar la tormenta de solicitudes fsync. Significa que es posible que necesite algún mecanismo para repetir el trabajo que se perdió en un accidente. Tiene la ventaja sobre VACUUM de que necesita un bloqueo de tabla mucho más fuerte que INSERT o UPDATE. Por lo tanto, solo debe preocuparse por los bloqueos de fila, no por los bloqueos de tabla.