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
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.
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
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.
Kadonnut päivitys
Koska kirjoituslukkoa ei ole, read committed -eristystasolla esiintyy vielä yksi ongelma – kadonneet päivitykset.
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.
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ää.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
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
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.
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
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.
Kadonnut päivitys
Koska kirjoituslukkoa ei ole, read committed -eristystasolla esiintyy vielä yksi ongelma – kadonneet päivitykset.
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.
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ää.
Kiitos palautteestasi!