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

Lås for SELECT, så en anden proces ikke får gamle data

Dit spørgsmål, der henviser til en ukendt kilde:

Jeg kiggede på rækkelåsning, men den siger, at du ikke kan forhindre selectstatements, hvilket lyder som om det ikke virker for min tilstand her. Er min eneste mulighed for at bruge rådgivende låse?

Den officielle dokumentation om sagen:

Låse på rækkeniveau påvirker ikke dataforespørgsel; de blokerer kun skrivere og skabe til samme række.

Samtidige forsøg vil ikke bare vælge, men forsøge at fjerne den samme rækkeniveaulås med SELECT ... FOR UPDATE - hvilket får dem til at vente på, at enhver tidligere transaktion, der holder en lås på den samme række, enten begår eller rulle tilbage. Lige hvad du ønskede.

Men , mange use cases er bedre løst med rådgivningslåse - i versioner før 9.5. Du kan stadig låse rækker, der behandles med FOR UPDATE desuden for at være sikker. Men hvis den næste transaktion bare vil behandle "den næste ledige række", er det ofte meget mere effektivt ikke at vente på den samme række, som næsten helt sikkert er utilgængelig, efter at låsen er udløst, men spring til "næste gratis" med det samme.

I Postgres 9.5+ overvej FOR UPDATE SKIP LOCKED for det. Som @Craig kommenterede, kan dette stort set erstatte rådgivende låse.

Relateret spørgsmål, der snubler over det samme præstationssvin:

  • Funktionen tager evigt at køre for et stort antal poster

Forklaring og kodeeksempel for rådgivende låse eller FOR UPDATE SKIP LOCKED i Postgres 9.5+:

  • Postgres OPDATERING ... GRÆNSE 1

For at låse mange rækker på én gang :

  • Sådan markeres et bestemt antal rækker i tabellen ved samtidig adgang


  1. Mysql-dækkende vs sammensat vs kolonneindeks

  2. Vil du fjerne dubletter med kun en MySQL-forespørgsel?

  3. pyodbc - meget langsom bulk indsættelseshastighed

  4. Sådan aktiveres MySQL Query Cache