Innanzitutto, al minimo dovresti fare un SELECT ... FOR UPDATE
quindi blocchi le righe rispetto ad altri SELECT ... FOR [SHARE|UPDATE]
accesso. Devi farlo all'interno di una transazione e conservare quella transazione finché non aggiorni l'ultima riga e commit
.
Le righe che SELECT ... FOR UPDATE
non bloccato contro il normale SELECT
; sono ancora leggibili per altre transazioni che non utilizzano FOR UPDATE
o FOR SHARE
.
Meglio ancora, prova a riformulare il tutto come un UPDATE ... FROM
o un'altra operazione basata su set in cui si esegue tutto il lavoro in una singola query. In genere funzionerà molto meglio di un SELECT ... FOR UPDATE
seguito da un flusso di UPDATE
s.