PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

In PostgreSQL, più UPDATE su righe diverse nella stessa tabella hanno blocchi in conflitto?

UPDATE blocca la riga, quindi non è necessario bloccarla prima. Se provi a UPDATE insiemi di righe sovrapposti contemporaneamente, il secondo UPDATE attenderà il commit o il rollback della prima transazione.

Il grosso problema con il tuo approccio, a parte il fatto che UPDATE non ha un LIMIT clausola - è che più lavoratori cercheranno tutti di afferrare le stesse righe. Ecco cosa succede:

  • worker1:filtra la tabella per trovare 200 righe e le blocca
  • lavoratore1:avvia l'aggiornamento delle righe
  • worker2:filtra la tabella per trovare 200 righe
  • worker2:tenta di avviare l'aggiornamento delle righe, ma ha selezionato le stesse righe di worker1 quindi si blocca sul blocco di worker1
  • lavoratore1:termina l'aggiornamento delle righe
  • worker2:dopo il rilascio del blocco, ricontrolla la condizione WHERE e scopre che nessuna delle righe corrisponde più perché worker1 le ha aggiornate. Aggiorna zero righe.

... e ripeti!

Devi:

  • Avere una coda centrale distribuire le righe in modo corretto e sicuro per la concorrenza; o
  • Assegna ai lavoratori intervalli di ID non sovrapposti su cui lavorare

Come per LIMIT - potresti usare WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id) - ma avresti lo stesso problema con entrambi i lavoratori che scelgono lo stesso insieme di righe da aggiornare.