Först, som minst du borde göra en SELECT ... FOR UPDATE
så du låser raderna mot andra SELECT ... FOR [SHARE|UPDATE]
tillgång. Du måste göra detta i en transaktion och hålla kvar den transaktionen tills du uppdaterar den sista raden och commit
.
Raderna du SELECT ... FOR UPDATE
inte låst mot normal SELECT
; de är fortfarande läsbara för andra transaktioner som inte använder FOR UPDATE
eller FOR SHARE
.
Ännu bättre, försök att omformulera det hela som en UPDATE ... FROM
eller annan set-baserad operation där du gör allt arbete i en enda fråga. Det kommer i allmänhet att prestera mycket bättre än en SELECT ... FOR UPDATE
följt av en ström av UPDATE
s.