Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Eristys | Acid
SQL-optimointi ja kyselyominaisuudet

Eristys

Pyyhkäise näyttääksesi valikon

Tietokantojen yhteydessä eristyvyys 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 eristyvyystasoa:

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

Read uncommitted

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

Likaiset luvut

Note
Lisätietoa

Likainen luku tapahtuu, kun yksi transaktio lukee tietoja, joita toinen transaktio on muuttanut mutta ei vielä vahvistanut.

Esimerkiksi kuvittele kaksi pankkitapahtumaa, jotka tapahtuvat samanaikaisesti: Transaktio A tarkistaa tilisi saldon samalla kun Transaktio B tallettaa rahaa tilillesi. Jos Transaktio A näkee kasvaneen saldon ennen kuin Transaktio B on valmis, kyseessä on likainen luku, sillä uusi saldo voidaan perua, jos Transaktio B epäonnistuu.

dirty+read

Toteutus

Voimme määrittää tapahtuman eristystason käyttämällä 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 tapahtuman eristystason "Read Uncommitted" -tasolle, jolloin tapahtuma voi mahdollisesti lukea muiden sitomattomien tapahtumien muokkaamaa dataa;

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

Voimme myös tarkistaa nykyisen eristystason seuraavalla komennolla:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Read Committed -eristystaso varmistaa, että tapahtuma näkee vain muun tapahtuman sitoman datan.
Tämä tarkoittaa, että muiden tapahtumien sitomattomat muutokset eivät ole näkyvissä Read Committed -eristystasolla toimiville tapahtumille.
Tämän seurauksena se estää likaiset luvut sallimalla tapahtuman lukea vain sitoutunutta dataa. Kuitenkin tällä tasolla esiintyy ongelmia ei-toistettavien lukujen kanssa.

Ei-toistettavat luvut

Note
Lisätietoa

Ei-toistettava luku tapahtuu, kun tapahtuma lukee saman rivin useita kertoja saman tapahtuman aikana, mutta haettu data muuttuu lukukertojen välillä muiden tapahtumien tekemien muutosten vuoksi. Tämä epäjohdonmukaisuus voi johtaa odottamattomaan toimintaan ja virheellisiin tuloksiin.

Esimerkiksi, kuvittele tapahtuma, joka kysyy asiakkaan tilin saldoa kahdesti. Ensimmäinen kysely palauttaa 1000 dollaria, mutta ennen tapahtuman päättymistä toinen tapahtuma tallettaa tilille 500 dollaria. Kun toinen kysely suoritetaan, se näyttää 1500 dollaria, mikä johtaa ei-toistettavaan lukuun, jossa sama data luetaan eri tavalla yhden tapahtuman sisällä toisen tapahtuman tekemien muutosten vuoksi.

"Read committed" -eristystaso sallii ei-toistettavat luvut, koska se lukitsee lukuoperaation arvoihin, jotka ovat sitomattomissa tapahtumissa, mutta ei lukitse kirjoitusoperaatiota.
Tämän seurauksena voimme kirjoittaa uutta dataa riviin, jota toinen tapahtuma parhaillaan lukee.

Ei-toistuva-luku

Kadonnut päivitys

Koska kirjoituslukkoa ei ole, read committed -eristystasolla esiintyy vielä yksi ongelma – kadonneet päivitykset.

Note
Lisätietoa

Kadonnut päivitys on tilanne tietokannan hallinnassa, jossa yksi transaktio korvaa toisen transaktion tekemät muutokset, mikä johtaa tietojen menetykseen. Tämä tapahtuu tyypillisesti silloin, kun useat transaktiot yrittävät päivittää samaa tietoa samanaikaisesti, ja yhden transaktion muutokset korvataan toisen transaktion toimesta ennen kuin ne on vahvistettu tietokantaan.

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

Kadonnut_päivitys

Toteutus

Tämän eristystason voi määrittää myös 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 sitä ei tarvitse erikseen määrittää.

question mark

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

Valitse oikea vastaus

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

Eristys

Tietokantojen yhteydessä eristyvyys 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 eristyvyystasoa:

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

Read uncommitted

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

Likaiset luvut

Note
Lisätietoa

Likainen luku tapahtuu, kun yksi transaktio lukee tietoja, joita toinen transaktio on muuttanut mutta ei vielä vahvistanut.

Esimerkiksi kuvittele kaksi pankkitapahtumaa, jotka tapahtuvat samanaikaisesti: Transaktio A tarkistaa tilisi saldon samalla kun Transaktio B tallettaa rahaa tilillesi. Jos Transaktio A näkee kasvaneen saldon ennen kuin Transaktio B on valmis, kyseessä on likainen luku, sillä uusi saldo voidaan perua, jos Transaktio B epäonnistuu.

dirty+read

Toteutus

Voimme määrittää tapahtuman eristystason käyttämällä 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 tapahtuman eristystason "Read Uncommitted" -tasolle, jolloin tapahtuma voi mahdollisesti lukea muiden sitomattomien tapahtumien muokkaamaa dataa;

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

Voimme myös tarkistaa nykyisen eristystason seuraavalla komennolla:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Read Committed -eristystaso varmistaa, että tapahtuma näkee vain muun tapahtuman sitoman datan.
Tämä tarkoittaa, että muiden tapahtumien sitomattomat muutokset eivät ole näkyvissä Read Committed -eristystasolla toimiville tapahtumille.
Tämän seurauksena se estää likaiset luvut sallimalla tapahtuman lukea vain sitoutunutta dataa. Kuitenkin tällä tasolla esiintyy ongelmia ei-toistettavien lukujen kanssa.

Ei-toistettavat luvut

Note
Lisätietoa

Ei-toistettava luku tapahtuu, kun tapahtuma lukee saman rivin useita kertoja saman tapahtuman aikana, mutta haettu data muuttuu lukukertojen välillä muiden tapahtumien tekemien muutosten vuoksi. Tämä epäjohdonmukaisuus voi johtaa odottamattomaan toimintaan ja virheellisiin tuloksiin.

Esimerkiksi, kuvittele tapahtuma, joka kysyy asiakkaan tilin saldoa kahdesti. Ensimmäinen kysely palauttaa 1000 dollaria, mutta ennen tapahtuman päättymistä toinen tapahtuma tallettaa tilille 500 dollaria. Kun toinen kysely suoritetaan, se näyttää 1500 dollaria, mikä johtaa ei-toistettavaan lukuun, jossa sama data luetaan eri tavalla yhden tapahtuman sisällä toisen tapahtuman tekemien muutosten vuoksi.

"Read committed" -eristystaso sallii ei-toistettavat luvut, koska se lukitsee lukuoperaation arvoihin, jotka ovat sitomattomissa tapahtumissa, mutta ei lukitse kirjoitusoperaatiota.
Tämän seurauksena voimme kirjoittaa uutta dataa riviin, jota toinen tapahtuma parhaillaan lukee.

Ei-toistuva-luku

Kadonnut päivitys

Koska kirjoituslukkoa ei ole, read committed -eristystasolla esiintyy vielä yksi ongelma – kadonneet päivitykset.

Note
Lisätietoa

Kadonnut päivitys on tilanne tietokannan hallinnassa, jossa yksi transaktio korvaa toisen transaktion tekemät muutokset, mikä johtaa tietojen menetykseen. Tämä tapahtuu tyypillisesti silloin, kun useat transaktiot yrittävät päivittää samaa tietoa samanaikaisesti, ja yhden transaktion muutokset korvataan toisen transaktion toimesta ennen kuin ne on vahvistettu tietokantaan.

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

Kadonnut_päivitys

Toteutus

Tämän eristystason voi määrittää myös 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 sitä ei tarvitse erikseen määrittää.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 6
some-alt