Forberedelse til SQL-interview · Lektion

De fire isolationsniveauer

Fra Read Uncommitted til Serializable, og hvad hvert niveau tillader.

Lektion 2 af 413 trin

De fire isolationsniveauer er en gratis Forberedelse til SQL-interview-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til SQL-interview, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.

Spørgsmålet bag spørgsmålet

Når en interviewer spørger "nævn de fire isolationsniveauer", er den egentlige test, om du kan forklare afvejningen: Stærkere isolation betyder færre anomalier, men lavere samtidighed.

SQL-standarden definerer fire niveauer i rækkefølge fra svagest til stærkest:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

Hvert niveau tillader eller forbyder et bestemt sæt læseanomalier. Denne lektion gennemgår niveauerne; den næste gennemgår anomalierne i detaljer.

Indstilling af isolationsniveauet

Du indstiller isolation pr. transaktion eller pr. session. Syntaksen er næsten identisk på tværs af databasemotorer.

Hvis du ikke indstiller niveauet, har alle databaser et standardniveau. At kende standardniveauerne er et hyppigt spørgsmål i jobsamtaler, så vi gennemgår dem til sidst.

-- Per transaction (standard SQL)
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- ... statements ...
COMMIT;

-- Per session
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Niveau 1: READ UNCOMMITTED

READ UNCOMMITTED er det svageste niveau. En transaktion kan læse rækker, som en anden transaktion har ændret, men ikke gennemført endnu. Disse kaldes beskidte læsninger.

Hvis den anden transaktion rulles tilbage, har du læst data, der aldrig officielt eksisterede. Det er farligt for alt, der skal være korrekt.

Bemærk: Postgres behandler READ UNCOMMITTED på samme måde som READ COMMITTED, så den udfører aldrig rent faktisk beskidte læsninger. SQL Server og MySQL håndhæver niveauet.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN;
-- may see another transaction's uncommitted (dirty) rows
SELECT balance FROM accounts WHERE id = 1;
COMMIT;

Niveau 2: READ COMMITTED

READ COMMITTED garanterer, at du kun læser data, der er gennemført. Ingen beskidte læsninger.

Hver SQL-sætning ser dog det seneste gennemførte øjebliksbillede. Hvis du kører den samme forespørgsel to gange i én transaktion, kan en anden gennemført transaktion i mellemtiden ændre resultatet. Denne anomali er en ikke-gentagelig læsning.

Dette er standardniveauet i Postgres, Oracle og SQL Server, og det er en fornuftig balance for de fleste applikationer.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- returns 500
-- another transaction commits an update to id = 1
SELECT balance FROM accounts WHERE id = 1;  -- may now return 700
COMMIT;

Niveau 3: REPEATABLE READ

REPEATABLE READ sikrer, at du får den samme værdi begge gange, hvis du læser en række to gange i den samme transaktion. Niveauet tager et konsistent øjebliksbillede ved transaktionens start.

Det forhindrer beskidte læsninger og ikke-gentagelige læsninger. Standarden tillader stadig fantomlæsninger: nye rækker, der matcher din WHERE-betingelse, og som dukker op, når du udfører forespørgslen igen.

Vigtigt: Dette er standardniveauet i MySQL/InnoDB, og InnoDBs implementering blokerer også de fleste fantomlæsninger via låse på næste nøgle.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- 500
-- another transaction commits a change to id = 1
SELECT balance FROM accounts WHERE id = 1;  -- still 500 in this txn
COMMIT;

Niveau 4: SERIALIZABLE

SERIALIZABLE er det strengeste niveau. Databasen garanterer, at resultatet af at køre transaktioner samtidigt er identisk med resultatet af at køre dem efter hinanden i en eller anden seriel rækkefølge.

Det forhindrer beskidte læsninger, ikke-gentagelige læsninger og fantomlæsninger. Prisen er flere låse eller, i Postgres, afbrydelser på grund af serialiseringsfejl, som du skal forsøge igen.

Formulering til jobsamtalen: "SERIALIZABLE giver indtrykket af, at alle transaktioner kørte alene, til gengæld for lavere samtidighed og mulige nye forsøg."

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT SUM(balance) FROM accounts;
INSERT INTO audit (total) VALUES (...);
COMMIT;  -- may raise a serialization_failure you retry

Anomalimatricen

Det mest nyttige at lære udenad er, hvilken anomali hvert niveau tillader. "Ja" betyder, at anomalien kan forekomme.

  • READ UNCOMMITTED: beskidt=Ja, ikke-gentagelig=Ja, fantom=Ja
  • READ COMMITTED: beskidt=Nej, ikke-gentagelig=Ja, fantom=Ja
  • REPEATABLE READ: beskidt=Nej, ikke-gentagelig=Nej, fantom=Ja (ifølge standarden)
  • SERIALIZABLE: beskidt=Nej, ikke-gentagelig=Nej, fantom=Nej

Hvert trin op forbyder endnu en anomali. Det er hele svaret.

Standarden kontra virkelige implementeringer

En vigtig forskel på seniorniveau er, at SQL-standarden definerer niveauerne ud fra, hvilke anomalier de skal forhindre, ikke hvordan de gør det. Virkelige databasemotorer forhindrer ofte flere anomalier.

  • Postgres REPEATABLE READ bruger isolation med øjebliksbillede og blokerer også fantomlæsninger, selv om der stadig kan opstå skrive-skævhed.
  • MySQL/InnoDB REPEATABLE READ blokerer fantomlæsninger med låse på næste nøgle.
  • Postgres SERIALIZABLE bruger SSI (serialiserbar isolation med øjebliksbilleder) og afbryder ved konflikter i stedet for at bruge tunge låse.

Hvis du nævner dette, viser du, at du ved, at standarden er et minimumskrav og ikke beskriver den præcise adfærd.

Standardniveauer for hver motor

Standardniveauer bliver nævnt hele tiden. Lær disse udenad:

  • PostgreSQL: READ COMMITTED
  • Oracle: READ COMMITTED (ingen beskidte læsninger nogensinde)
  • SQL Server: READ COMMITTED
  • MySQL (InnoDB): REPEATABLE READ

MySQLs særtilfælde er en yndlingsfælde. Hvis du bliver spurgt "hvad er standardniveauet for isolation?", skal du altid først afklare databasemotoren.

Valg af niveau i praksis

Hvordan beslutter du dig? Se det som en afvejning mellem risiko og gennemløb.

  • Brug READ COMMITTED til typiske OLTP-systemer; det er hurtigt og undgår beskidte læsninger.
  • Brug REPEATABLE READ, når en transaktion læser de samme data flere gange og skal holde dem stabile (rapporter og beregninger i flere trin).
  • Brug SERIALIZABLE til logik, hvor korrekthed er afgørende, og design logik til nye forsøg ved afbrydelser.

Brug næsten aldrig READ UNCOMMITTED i produktion.

Almindelige opfølgende spørgsmål

Når du har opremset niveauerne, følger interviewere ofte op med hurtige spørgsmål. Hav præcise svar klar:

  • "Hvilket niveau forhindrer beskidte læsninger, men tillader ikke-gentagelige læsninger?" READ COMMITTED.
  • "Hvilken er den eneste anomali, som REPEATABLE READ stadig tillader ifølge standarden?" Fantomlæsninger.
  • "Hvorfor ikke altid bruge SERIALIZABLE?" Det reducerer samtidigheden og kan tvinge dig til at prøve transaktioner igen ved serialiseringsfejl.
  • "Koster et højere niveau mere?" Ja, i form af låse eller omkostninger ved afbrydelse og nyt forsøg.

Hvis du kan svare med det samme, viser det, at du har forstået rangstigen og ikke bare lært den udenad.

Hurtigt tjek

Dette er en af de kendsgerninger om standardniveauer, der oftest bliver afprøvet.

Opsummering: Fire niveauer, én afvejning

De fire isolationsniveauer udgør en rangstige fra svagest til stærkest: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE. Hvert trin op forhindrer endnu en anomali (beskidt, ikke-gentagelig eller fantomlæsning) på bekostning af samtidighed.

Husk standardniveauerne (READ COMMITTED overalt undtagen MySQLs REPEATABLE READ), og bemærk, at virkelige databasemotorer ofte forhindrer mere, end standarden kræver. Derefter undersøger vi de tre læseanomalier, som disse niveauer er udformet til at forhindre.

Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
30
Lektioner
120

Ofte stillede spørgsmål

Er lektionen “De fire isolationsniveauer” gratis?

Ja — hele teksten til “De fire isolationsniveauer” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til SQL-interview-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “De fire isolationsniveauer”?

Fra Read Uncommitted til Serializable, og hvad hvert niveau tillader. Du øver dig i Forberedelse til SQL-interview med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Forberedelse til SQL-interview?

Der kræves ingen tidligere erfaring. Forberedelse til SQL-interview på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “De fire isolationsniveauer”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Forberedelse til SQL-interview-lektion?

Ja. Alle Forberedelse til SQL-interview-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. ACID-egenskaber forklaret
  2. De fire isolationsniveauer
  3. Dirty reads, non-repeatable reads og phantom reads
  4. Deadlocks, låsning og MVCC
← Tilbage til Forberedelse til SQL-interview