Estoy un poco confundido al leer acerca de los bloqueos de PostgreSQL.Bloqueos en PostgreSQL al ejecutar UPDATE
Un ejemplo típico callejón sin salida es:
-- Transaction 1
UPDATE customer SET ... WHERE id = 1
UPDATE customer SET ... WHERE id = 2
-- Transaction 2
UPDATE customer SET ... WHERE id = 2
UPDATE customer SET ... WHERE id = 1
Pero lo que si cambio el código de la siguiente manera:
-- Transaction 1
UPDATE customer SET ... WHERE id IN (1, 2)
-- Transaction 2
UPDATE customer SET ... WHERE id IN (1, 2)
será una posibilidad de estancamiento aquí?
Esencialmente mi pregunta es: en el segundo caso, ¿PostgreSQL bloquea las filas una a una, o bloquea todo el alcance cubierto por la condición WHERE
?
¡Gracias de antemano!
¡Gracias! Entonces, mi ejemplo anterior puede provocar un punto muerto (porque no conocemos el orden en el que se procesan las filas en ambas transacciones). – vyakhir
Podría causar un punto muerto, aunque eso sería raro; a diferencia del primer ejemplo (elegir explícitamente diferentes órdenes), donde sería común. Puede descartar un punto muerto mediante la adopción de un bloqueo a nivel de tabla con la fuerza adecuada durante cada transacción que actualice la tabla, pero esa curación puede ser peor que la enfermedad. Ver la sección de doc. A la que hice referencia para más detalles. – kgrittn
¿Pero PostgreSQL libera el bloqueo después de que se haya actualizado la fila, pero toda la instrucción UPDATE aún no ha finalizado? En otras palabras, si tenemos una declaración como ACTUALIZACIÓN ... WHERE id IN (1,2,3,4,5) después de las actualizaciones de postgresql, por ejemplo, fila con id = 1 y continúa con la fila con id = 2, ¿liberará la fila id = 1? En caso afirmativo, ¿de qué forma se ruedan las filas si es necesario? – vyakhir