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

En PostgreSQL, ¿las múltiples ACTUALIZACIONES en diferentes filas de la misma tabla tienen bloqueos en conflicto?

UPDATE bloquea la fila, por lo que no necesita bloquearla primero. Si intenta UPDATE conjuntos superpuestos de filas simultáneamente, el segundo UPDATE esperará a que la primera transacción se confirme o revierta.

El gran problema con su enfoque, aparte del hecho de que UPDATE no tiene un LIMIT cláusula - es que varios trabajadores intentarán tomar las mismas filas. Esto es lo que sucede:

  • worker1:filtra la tabla para encontrar 200 filas y las bloquea
  • worker1:comienza a actualizar filas
  • worker2:filtra la tabla para encontrar 200 filas
  • trabajador2:intenta comenzar a actualizar las filas, pero ha seleccionado las mismas filas que el trabajador1, por lo que bloquea el bloqueo del trabajador1
  • worker1:Finaliza la actualización de filas
  • worker2:después de liberar el bloqueo, vuelve a verificar la condición WHERE y descubre que ninguna de las filas coincide porque el trabajador1 las ha actualizado. Actualiza cero filas.

... y repite!

Necesitas:

  • Tener una cola central repartir filas de una manera adecuada y segura para la concurrencia; o
  • Asigne a los trabajadores rangos de ID que no se superpongan para trabajar

En cuanto a LIMIT - podría usar WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id) - pero tendría el mismo problema si ambos trabajadores eligieran el mismo conjunto de filas para actualizar.