Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Isolasjon | Acid
SQL-optimalisering og spørringsfunksjoner

Isolasjon

Sveip for å vise menyen

I databaser refererer isolasjon til evnen et databasesystem har til å kontrollere synligheten av endringer gjort av samtidige transaksjoner. Dette sikrer at transaksjoner opererer uavhengig av hverandre, unngår forstyrrelser og opprettholder dataintegritet.

Det finnes 4 isolasjonsnivåer i SQL:

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

Read uncommitted

Dette er det laveste isolasjonsnivået, hvor transaksjoner kan se endringer gjort av andre transaksjoner selv før de er bekreftet (committed). Dette nivået tillater skitne lesninger (dirty reads), noe som betyr at en transaksjon kan lese data som er endret av en annen transaksjon, men som ennå ikke er bekreftet.

Skitne lesninger

Note
Les mer

En skitten lesning (dirty read) oppstår når én transaksjon leser data som er endret av en annen transaksjon, men som ennå ikke er bekreftet.

For eksempel, tenk deg to banktransaksjoner som skjer samtidig: Transaksjon A sjekker kontosaldoen din mens Transaksjon B setter inn penger på kontoen din. Hvis Transaksjon A ser den økte saldoen før Transaksjon B er ferdig, er det en skitten lesning, siden den nye saldoen kan bli rullet tilbake hvis Transaksjon B feiler.

dirty+read

Implementering

For å angi isolasjonsnivået for transaksjonen kan vi bruke følgende kommando i spørringen vår:

-- 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 setningen endrer isolasjonsnivået for den nåværende transaksjonen til "Read Uncommitted", noe som tillater transaksjonen å potensielt lese data som er endret av andre ikke-committede transaksjoner;

  • denne kommandoen må brukes kun inne i transaksjonsblokken! Ellers vil den ikke ha noen effekt, og et standard isolasjonsnivå vil bli brukt.

Vi kan også sjekke gjeldende isolasjonsnivå ved å bruke følgende kommando:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Isolasjonsnivået Read Committed sikrer at en transaksjon kun ser data som er blitt committet av andre transaksjoner.
Dette betyr at ikke-committede endringer gjort av andre transaksjoner ikke er synlige for transaksjoner som opererer under Read Committed-isolasjon.
Som et resultat forhindrer det skitne lesninger ved å tillate en transaksjon å lese kun committede data. Dette transaksjonsnivået har imidlertid problemer med ikke-repeterbare lesninger.

Ikke-repeterbare lesninger

Note
Les mer

En ikke-repeterbar lesning oppstår når en transaksjon leser samme rad flere ganger innenfor samme transaksjon, men dataene den henter endres mellom lesningene på grunn av endringer gjort av andre transaksjoner. Denne inkonsistensen kan føre til uventet oppførsel og feilaktige resultater.

For eksempel, tenk deg en transaksjon som spør etter saldoen på en kundes konto to ganger. Første spørring returnerer $1000, men før transaksjonen fullføres, setter en annen transaksjon inn $500 på kontoen. Når den andre spørringen kjøres, viser den $1500, noe som fører til en ikke-repeterbar lesning, der de samme dataene leses forskjellig innenfor én transaksjon på grunn av endringer gjort av en annen transaksjon.

Isolasjonsnivået "Read committed" tillater ikke-repeterbare lesninger fordi det låser leseoperasjonen på verdier som er under ikke-committede transaksjoner, men låser ikke skriveoperasjonen.
Som et resultat kan vi skrive nye data til raden som for øyeblikket blir lest av en annen transaksjon.

Ikke-gjentatt lesing

Tapt oppdatering

På grunn av fraværet av skrive-lås oppstår det et ytterligere problem med isolasjonsnivået read committed – tapte oppdateringer.

Note
Les mer

En tapt oppdatering er en situasjon innen databaseadministrasjon der én transaksjon overskriver endringene gjort av en annen transaksjon, noe som fører til tap av data. Dette skjer vanligvis når flere transaksjoner prøver å oppdatere de samme dataene samtidig, og én transaksjons endringer blir overskrevet av en annen transaksjon før de er lagret i databasen.

Tapte oppdateringer oppstår når to parallelle transaksjoner forsøker å endre samme rad. Som et resultat vil transaksjonen som blir bekreftet sist overskrive verdiene som er bekreftet av andre transaksjoner.

Lost_update

Implementering

Dette isolasjonsnivået kan også spesifiseres med følgende kommandoer:

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

/* Transaction query */
COMMIT;

Det er viktig å merke seg at Read Committed er standard isolasjonsnivå for de fleste databasesystemer, og derfor kan vi utelate å spesifisere det.

question mark

Hvis en transaksjon leser data som har blitt endret av en annen ikke-committet transaksjon, hvilken type lesing er det?

Velg det helt riktige svaret

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 1. Kapittel 6

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 1. Kapittel 6
some-alt