sql >> Base de Datos >  >> RDS >> PostgreSQL

Bloqueo para SELECCIONAR para que otro proceso no obtenga datos antiguos

Su pregunta, haciendo referencia a una fuente desconocida:

Investigué el bloqueo de filas, pero dice que no puede evitar las declaraciones de selección, lo que parece que no funcionará para mi condición aquí. ¿Es mi única opción usar bloqueos de aviso?

La documentación oficial al respecto:

Los bloqueos a nivel de fila no afectan la consulta de datos; bloquean solo escritores y casilleros a la misma fila.

Los intentos simultáneos no solo seleccionarán sino que intentarán eliminar el mismo bloqueo de nivel de fila con SELECT ... FOR UPDATE - lo que hace que esperen a que cualquier transacción anterior que tenga un bloqueo en la misma fila se confirme o revierta. Justo lo que querías.

Sin embargo , muchos casos de uso se resuelven mejor con bloqueos de advertencia - en versiones anteriores a la 9.5. Todavía puede bloquear las filas que se procesan con FOR UPDATE adicionalmente para estar seguro. Pero si la siguiente transacción solo quiere procesar "la siguiente fila libre", a menudo es mucho es más eficiente no esperar a la misma fila, que casi con toda seguridad no está disponible después de liberar el bloqueo, sino pasar al "siguiente libre" inmediatamente.

En Postgres 9.5+ considere FOR UPDATE SKIP LOCKED para esto. Como comentó @Craig, esto puede reemplazar en gran medida los bloqueos de aviso.

Pregunta relacionada tropezando con el mismo problema de rendimiento:

  • La función tarda una eternidad en ejecutarse para una gran cantidad de registros

Explicación y ejemplo de código para bloqueos de aviso o FOR UPDATE SKIP LOCKED en Postgres 9.5+:

  • ACTUALIZACIÓN de Postgres... LÍMITE 1

Para bloquear muchas filas a la vez :

  • Cómo marcar cierto número de filas en la tabla en acceso concurrente