Din fråga, med hänvisning till en okänd källa:
Jag tittade på radlåsning, men det står att du inte kan förhindra selectstatements vilket låter som att det inte kommer att fungera för mitt tillstånd här. Är mitt enda alternativ att använda rådgivande lås?
Den officiella dokumentationen om ärendet:
Lås på radnivå påverkar inte dataförfrågningar; de blockerar bara skrivare och skåp till samma rad.
Samtidiga försök kommer inte bara att välja utan försöka ta ut samma radnivålås med SELECT ... FOR UPDATE
- vilket gör att de väntar på att någon tidigare transaktion som håller ett lås på samma rad för att antingen begå eller rulla tillbaka. Precis vad du ville ha.
Men , många användningsfall löses bättre med rådgivningslås - i versioner före 9.5. Du kan fortfarande låsa rader som bearbetas med FOR UPDATE
dessutom för att vara säker. Men om nästa transaktion bara vill bearbeta "nästa lediga rad" är det ofta mycket effektivare att inte vänta på samma rad, vilket nästan säkert inte är tillgängligt efter att låset släppts, utan hoppa till "nästa lediga" omedelbart.
I Postgres 9.5+ överväg att FOR UPDATE SKIP LOCKED
för detta. Som @Craig kommenterade kan detta till stor del ersätta rådgivande lås.
Relaterad fråga som snubblar över samma prestationssvin:
- Funktionen tar evigheter att köra för ett stort antal poster
Förklaring och kodexempel för rådgivande lås eller FOR UPDATE SKIP LOCKED
i Postgres 9.5+:
- Postgres UPPDATERING ... GRÄNS 1
För att låsa många rader samtidigt :
- Hur man markerar ett visst antal rader i tabellen vid samtidig åtkomst