Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Eristyvyys | Acid
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
SQL-optimointi ja kyselyominaisuudet

bookEristyvyys

Tietokantojen yhteydessä eristyvyys (isolation) tarkoittaa tietokantajärjestelmän kykyä hallita samanaikaisten transaktioiden tekemien muutosten näkyvyyttä. Se varmistaa, että transaktiot toimivat riippumattomasti toisistaan, estäen häiriöt ja säilyttäen tietojen eheyden.

SQL:ssä on 4 eristystasoa:

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

Read uncommitted

Tämä on alin eristystaso, jossa transaktiot voivat nähdä muiden transaktioiden tekemät muutokset jo ennen niiden vahvistamista (commit). Tämä taso sallii likaiset luvut (dirty reads), eli transaktio voi lukea tietoja, joita toinen transaktio on muuttanut, mutta joita ei ole vielä vahvistettu.

Likaiset luvut

Toteutus

Transaktion eristystason määrittämiseksi voidaan käyttää seuraavaa komentoa kyselyssä:

-- 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;: Tämä lauseke muuttaa nykyisen transaktion eristystason "Read Uncommitted" -tasolle, jolloin transaktio voi mahdollisesti lukea muiden vahvistamattomien transaktioiden muokkaamia tietoja;

  • tätä komentoa tulee käyttää vain transaktiolohkon sisällä! Muussa tapauksessa sillä ei ole vaikutusta ja käytössä on oletuseristystaso.

Nykyisen eristystason voi tarkistaa seuraavalla komennolla:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Read Committed -eristystaso varmistaa, että transaktio näkee vain muiden transaktioiden vahvistamat tiedot.
Tämä tarkoittaa, että muiden transaktioiden vahvistamattomat muutokset eivät ole näkyvissä Read Committed -eristystasolla toimiville transaktioille.
Tämän seurauksena se estää likaiset luvut sallimalla transaktion lukea vain vahvistettuja tietoja. Kuitenkin tällä tasolla esiintyy ongelmia ei-toistettavien lukujen (non-repeatable reads) kanssa.

Ei-toistettavat luvut

"Read committed" -eristystaso sallii ei-toistettavat luvut, koska se lukitsee lukuoperaation arvoihin, jotka ovat keskeneräisissä transaktioissa, mutta ei lukitse kirjoitusoperaatiota.
Tämän seurauksena voidaan kirjoittaa uutta dataa riviin, jota toinen transaktio parhaillaan lukee.

Kadonneet päivitykset

Koska kirjoituslukko puuttuu, read committed -eristystasolla esiintyy vielä yksi ongelma – kadonneet päivitykset.

Kadonneet päivitykset tapahtuvat, kun kaksi rinnakkaista transaktiota yrittää muuttaa samaa riviä. Tällöin myöhemmin vahvistettu transaktio korvaa muiden transaktioiden vahvistamat arvot.

Toteutus

Voimme myös määrittää tämän eristystason seuraavilla komennoilla:

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

/* Transaction query */
COMMIT;

On tärkeää huomata, että Read Committed on oletuseristystaso useimmissa tietokantahallintajärjestelmissä, minkä vuoksi sen määrittäminen voidaan usein jättää pois.

question mark

Jos transaktio lukee tietoja, joita toinen sitomaton transaktio on muuttanut, minkä tyyppisestä luvusta on kyse?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 6

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

Can you explain the other isolation levels like Repeatable Read and Serializable?

What are the main differences between dirty reads, non-repeatable reads, and lost updates?

Can you provide examples of when to use each isolation level?

bookEristyvyys

Pyyhkäise näyttääksesi valikon

Tietokantojen yhteydessä eristyvyys (isolation) tarkoittaa tietokantajärjestelmän kykyä hallita samanaikaisten transaktioiden tekemien muutosten näkyvyyttä. Se varmistaa, että transaktiot toimivat riippumattomasti toisistaan, estäen häiriöt ja säilyttäen tietojen eheyden.

SQL:ssä on 4 eristystasoa:

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

Read uncommitted

Tämä on alin eristystaso, jossa transaktiot voivat nähdä muiden transaktioiden tekemät muutokset jo ennen niiden vahvistamista (commit). Tämä taso sallii likaiset luvut (dirty reads), eli transaktio voi lukea tietoja, joita toinen transaktio on muuttanut, mutta joita ei ole vielä vahvistettu.

Likaiset luvut

Toteutus

Transaktion eristystason määrittämiseksi voidaan käyttää seuraavaa komentoa kyselyssä:

-- 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;: Tämä lauseke muuttaa nykyisen transaktion eristystason "Read Uncommitted" -tasolle, jolloin transaktio voi mahdollisesti lukea muiden vahvistamattomien transaktioiden muokkaamia tietoja;

  • tätä komentoa tulee käyttää vain transaktiolohkon sisällä! Muussa tapauksessa sillä ei ole vaikutusta ja käytössä on oletuseristystaso.

Nykyisen eristystason voi tarkistaa seuraavalla komennolla:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Read Committed -eristystaso varmistaa, että transaktio näkee vain muiden transaktioiden vahvistamat tiedot.
Tämä tarkoittaa, että muiden transaktioiden vahvistamattomat muutokset eivät ole näkyvissä Read Committed -eristystasolla toimiville transaktioille.
Tämän seurauksena se estää likaiset luvut sallimalla transaktion lukea vain vahvistettuja tietoja. Kuitenkin tällä tasolla esiintyy ongelmia ei-toistettavien lukujen (non-repeatable reads) kanssa.

Ei-toistettavat luvut

"Read committed" -eristystaso sallii ei-toistettavat luvut, koska se lukitsee lukuoperaation arvoihin, jotka ovat keskeneräisissä transaktioissa, mutta ei lukitse kirjoitusoperaatiota.
Tämän seurauksena voidaan kirjoittaa uutta dataa riviin, jota toinen transaktio parhaillaan lukee.

Kadonneet päivitykset

Koska kirjoituslukko puuttuu, read committed -eristystasolla esiintyy vielä yksi ongelma – kadonneet päivitykset.

Kadonneet päivitykset tapahtuvat, kun kaksi rinnakkaista transaktiota yrittää muuttaa samaa riviä. Tällöin myöhemmin vahvistettu transaktio korvaa muiden transaktioiden vahvistamat arvot.

Toteutus

Voimme myös määrittää tämän eristystason seuraavilla komennoilla:

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

/* Transaction query */
COMMIT;

On tärkeää huomata, että Read Committed on oletuseristystaso useimmissa tietokantahallintajärjestelmissä, minkä vuoksi sen määrittäminen voidaan usein jättää pois.

question mark

Jos transaktio lukee tietoja, joita toinen sitomaton transaktio on muuttanut, minkä tyyppisestä luvusta on kyse?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 6
some-alt