sql >> Database >  >> RDS >> PostgreSQL

Vergrendelen voor SELECT zodat een ander proces geen oude gegevens krijgt

Uw vraag, verwijzend naar een onbekende bron:

Ik heb gekeken naar rijvergrendeling, maar er staat dat je selectstatements niet kunt voorkomen, wat klinkt alsof het hier niet werkt voor mijn toestand. Is mijn enige optie om adviesvergrendelingen te gebruiken?

De officiële documentatie hierover:

Vergrendelingen op rijniveau hebben geen invloed op het opvragen van gegevens; ze blokkeren alleen schrijvers en kluisjes naar dezelfde rij.

Gelijktijdige pogingen zullen niet alleen dezelfde vergrendeling op rijniveau selecteren, maar proberen uit te schakelen met SELECT ... FOR UPDATE - waardoor ze wachten op een eerdere transactie met een slot op dezelfde rij om ofwel vast te leggen of terug te draaien. Precies wat je wilde.

Echter , veel gebruiksgevallen kunnen beter worden opgelost met adviserende sloten - in versies vóór 9.5. Je kunt rijen die worden verwerkt nog steeds vergrendelen met FOR UPDATE bovendien voor de zekerheid. Maar als de volgende transactie alleen "de volgende vrije rij" wil verwerken, is dat vaak veel efficiënter om niet te wachten op dezelfde rij, die vrijwel zeker niet beschikbaar is nadat het slot is vrijgegeven, maar direct naar de "volgende vrije" gaat.

Overweeg in Postgres 9.5+ FOR UPDATE SKIP LOCKED voor deze. Zoals @Craig opmerkte, kan dit adviesvergrendelingen grotendeels vervangen.

Verwante vraag die struikelt over hetzelfde prestatievarken:

  • Het duurt eeuwig voordat de functie wordt uitgevoerd voor een groot aantal records

Uitleg en codevoorbeeld voor adviessloten of FOR UPDATE SKIP LOCKED in Postgres 9.5+:

  • Postgres-UPDATE ... LIMIET 1

Om veel rijen tegelijk te vergrendelen :

  • Hoe een bepaald aantal rijen in de tabel te markeren bij gelijktijdige toegang


  1. Geldige datumcontroles in Oracle

  2. Hoe selecteer je alleen de eerste rijen voor elke unieke waarde van een kolom?

  3. Een databasediagram maken in MySQL Workbench

  4. Invoegen in... Samenvoegen... Selecteer (SQL Server)