Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Isolation | Acid
SQL-optimering og Forespørgselsfunktioner

Isolation

Stryg for at vise menuen

I databasesammenhæng refererer isolation til en databasesystems evne til at kontrollere synligheden af ændringer foretaget af samtidige transaktioner. Det sikrer, at transaktioner fungerer uafhængigt af hinanden, undgår forstyrrelser og opretholder dataintegritet.

Der findes 4 isolationsniveauer i SQL:

  • read uncommitted;
  • read committed;
  • repeatable read;
  • serializable.

Read uncommitted

Dette er det laveste isolationsniveau, hvor transaktioner kan se ændringer foretaget af andre transaktioner, selv før de er committet. Dette niveau tillader dirty reads, hvilket betyder, at en transaktion kan læse data, der er blevet ændret af en anden transaktion, men endnu ikke committet.

Dirty reads

Note
Læs mere

Et dirty read opstår, når én transaktion læser data, der er blevet ændret af en anden transaktion, men endnu ikke committet.

For eksempel, forestil dig to banktransaktioner, der sker samtidigt: Transaktion A tjekker din kontosaldo, mens Transaktion B indsætter penge på din konto. Hvis Transaktion A ser den forhøjede saldo, før Transaktion B er færdig, er det et dirty read, da den nye saldo kan blive rullet tilbage, hvis Transaktion B fejler.

dirty+read

Implementering

For at angive isolationsniveauet for transaktionen kan vi bruge følgende kommando i vores forespørgsel:

-- Start transaction
BEGIN;
-- Set the isolation level for the transaction
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

/* Transaction query */
COMMIT;
  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;: Denne sætning ændrer isolationsniveauet for den aktuelle transaktion til "Read Uncommitted", hvilket tillader transaktionen potentielt at læse data, der er ændret af andre ikke-committede transaktioner;

  • denne kommando skal kun bruges inden for transaktionsblokken! Ellers vil den ikke have nogen effekt, og et standard isolationsniveau vil blive brugt.

Vi kan også kontrollere det aktuelle isolationsniveau ved at bruge følgende kommando:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Isolationsniveauet Read Committed sikrer, at en transaktion kun ser data, der er blevet committet af andre transaktioner.
Dette betyder, at ikke-committede ændringer foretaget af andre transaktioner ikke er synlige for transaktioner, der opererer under Read Committed isolation.
Som resultat forhindrer det dirty reads ved kun at tillade en transaktion at læse committede data. Dog har dette transaktionsniveau problemer med ikke-repeterbare læsninger.

Ikke-repeterbare læsninger

Note
Læs mere

En ikke-repeterbar læsning opstår, når en transaktion læser den samme række flere gange inden for samme transaktion, men de data, der hentes, ændrer sig mellem læsningerne på grund af ændringer foretaget af andre transaktioner. Denne inkonsistens kan føre til uventet adfærd og forkerte resultater.

For eksempel, forestil dig en transaktion, der forespørger en kundes kontosaldo to gange. Den første forespørgsel returnerer $1000, men før transaktionen afsluttes, indsætter en anden transaktion $500 på kontoen. Når den anden forespørgsel udføres, vises $1500, hvilket fører til en ikke-repeterbar læsning, hvor de samme data læses forskelligt inden for en enkelt transaktion på grund af ændringer foretaget af en anden transaktion.

Isolationsniveauet "Read committed" tillader ikke-repeterbare læsninger, fordi det låser læseoperationen på værdier, der er under ikke-committede transaktioner, men låser ikke skriveoperationen.
Som resultat kan vi skrive nye data til rækken, der i øjeblikket læses af en anden transaktion.

Ikke-gentaget læsning

Tabt opdatering

På grund af manglende skrive-lås opstår der endnu et problem med read committed-isolationsniveauet – tabte opdateringer.

Note
Læs mere

En tabt opdatering er en situation inden for databaseadministration, hvor én transaktion overskriver ændringer foretaget af en anden transaktion, hvilket fører til tab af data. Dette sker typisk, når flere transaktioner forsøger at opdatere de samme data samtidigt, og én transaktions ændringer bliver overskrevet af en anden transaktion, før de er blevet committet til databasen.

Tabte opdateringer opstår, når to parallelle transaktioner forsøger at ændre den samme række. Som følge heraf overskriver den transaktion, der bliver committet sidst, de værdier, der er committet af andre transaktioner.

Lost_update

Implementering

Dette isolationsniveau kan også angives ved hjælp af følgende kommandoer:

-- Start transaction
BEGIN;
-- Set the isolation level for the session
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

/* Transaction query */
COMMIT;

Det er vigtigt at bemærke, at Read Committed er standard-isoleringsniveauet for de fleste databasehåndteringssystemer, hvilket er grunden til, at vi kan undlade at specificere det.

question mark

Hvis en transaktion læser data, der er blevet ændret af en anden ikke-committet transaktion, hvilken type læsning er det?

Vælg det korrekte svar

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 1. Kapitel 6

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 1. Kapitel 6
some-alt