Valmistautuminen ohjelmointihaastatteluihin · Oppitunti

Likaiset, toistamattomat ja haamulukemat

Kolme lukupoikkeamaa ja eristystaso, joka estää kunkin niistä.

Oppitunti 3/413 vaihetta

Likaiset, toistamattomat ja haamulukemat on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Valmistautuminen ohjelmointihaastatteluihin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.

Kolme lukuanomaliaa

Eristystasot estävät tiettyjä samanaikaisuusvirheitä, joita kutsutaan lukuanomalioksi. Haastattelijat odottavat, että määrittelette kaikki kolme täsmällisesti ja yhdistätte kunkin siihen tasoon, joka estää sen.

  • Likainen luku – vahvistamattomien tietojen lukeminen
  • Toistumaton luku – rivi muuttuu kahden lukukerran välillä
  • Haamuluku – uusia rivejä ilmestyy kahden lukukerran välillä

Haasteena on erottaa toistumaton luku haamuluvusta, koska molemmissa kysely suoritetaan uudelleen ja tulokset ovat erilaiset.

Likainen luku: määritelmä

Likainen luku tapahtuu, kun transaktio T1 lukee rivin, jota transaktio T2 on muuttanut mutta ei vielä vahvistanut. Jos T2 tekee sitten rollbackin, T1 on toiminut tietojen perusteella, joita ei koskaan oikeasti ollut olemassa.

Vain READ UNCOMMITTED sallii likaiset luvut. Kaikki korkeammat tasot estävät ne.

Vaara käytännössä: laina hyväksytään talletuksen perusteella, mutta talletus perutaan muutamaa sekuntia myöhemmin.

Likainen luku: aikajana

Lukekaa kaksi saraketta aikajanana. T1 käyttää tasoa READ UNCOMMITTED.

T1 näkee saldona 700, mutta T2 ei koskaan tee committia. 700 oli T2:n keskeneräisen työn synnyttämä haamu. Kun T2 tekee rollbackin, todellinen arvo on edelleen 500. T1 teki päätöksen epäkelpojen tietojen perusteella.

-- T2 (not committed)        | -- T1 (READ UNCOMMITTED)
BEGIN;                       |
UPDATE accounts              |
  SET balance = 700          |
  WHERE id = 1;              |
                             | SELECT balance FROM accounts
                             |   WHERE id = 1;  -- reads 700 (dirty!)
ROLLBACK;                    |
                             | -- T1 acted on a value that never existed

Toistumaton luku: määritelmä

Toistumaton luku tapahtuu, kun T1 lukee rivin, T2 commitoi kyseisen rivin päivityksen tai poiston, ja T1 lukee rivin uudelleen ja näkee eri arvon.

Huomioikaa keskeinen ero likaiseen lukuun: tässä T2 on commitoinut muutoksen. Tiedot ovat todellisia, mutta ne muuttuivat T1:n alla yhden transaktion aikana.

READ COMMITTED sallii tämän edelleen. REPEATABLE READ ja sitä korkeammat tasot estävät sen lukemalla vakaasta tilannevedoksesta.

Toistumaton luku: aikajana

T1 toimii tasolla READ COMMITTED ja lukee saman rivin kahdesti. Lukukertojen välillä T2 commitoi muutoksen.

Sama pääavain palauttaa yhden transaktion sisällä kaksi eri arvoa. Tämä epäjohdonmukaisuus voi rikkoa monivaiheisen logiikan, joka olettaa rivin pysyvän muuttumattomana.

-- T1 (READ COMMITTED)              | -- T2
BEGIN;                              |
SELECT balance FROM accounts        |
  WHERE id = 1;  -- 500            |
                                    | BEGIN;
                                    | UPDATE accounts SET balance = 900
                                    |   WHERE id = 1;
                                    | COMMIT;
SELECT balance FROM accounts        |
  WHERE id = 1;  -- 900 (changed!) |
COMMIT;                             |

Haamuluku: määritelmä

Haamuluku tapahtuu, kun T1 suorittaa hakuehdon sisältävän kyselyn, T2 commitoi ehtoon täsmäävien rivien INSERTin (tai DELETEn), ja T1 suorittaa kyselyn uudelleen ja näkee erilaisen rivijoukon.

Ero toistumattomaan lukuun on seuraava: toistumattomassa luvussa olemassa olevan rivin arvo muuttuu; haamuluvussa predikaattiin täsmäävien rivien määrä muuttuu.

Vain SERIALIZABLE takaa standardin mukaan haamulukujen estämisen.

Haamuluku: aikajana

T1 laskee suurisaldoiset tilit kahdesti. Laskukertojen välillä T2 lisää uuden ehdon täyttävän rivin ja tekee commitin.

Mikään olemassa oleva rivi ei muuttunut, mutta COUNT-tulos on erilainen. Uusi rivi on T1:n tulosjoukkoon ilmestynyt ”haamu”.

-- T1 (REPEATABLE READ, standard)      | -- T2
BEGIN;                                 |
SELECT COUNT(*) FROM accounts           |
  WHERE balance > 1000;  -- 3          |
                                       | INSERT INTO accounts(id, balance)
                                       |   VALUES (99, 5000);
                                       | COMMIT;
SELECT COUNT(*) FROM accounts           |
  WHERE balance > 1000;  -- 4 (phantom)|
COMMIT;                                |

Anomalioiden yhdistäminen eristystasoihin

Tämä yhdistelmä on aiheen ydin. Kunkin anomalian estävä alin taso:

  • Likainen luku estyy tasolla READ COMMITTED ja sitä korkeammilla tasoilla.
  • Toistumaton luku estyy tasolla REPEATABLE READ ja sitä korkeammilla tasoilla.
  • Haamuluku estyy tasolla SERIALIZABLE standardin mukaan.

Huomatkaa, kuinka nimet vastaavat vaikutusta: REPEATABLE READ tekee luvuista toistettavia, ja tasot on nimetty niiden anomalioiden mukaan, jotka ne ensi kertaa korjaavat.

Toistumaton luku ja haamuluku: selkeä ero

Tämä sekoitetaan haastatteluissa kaikkein useimmin. Pitäkää mielessänne tämä yksi lause:

Toistumaton luku = olemassa olevan rivin arvo muuttui. Haamuluku = ehtoon täsmäävien rivien joukko muuttui (rivejä lisättiin tai poistettiin).

Testatkaa itseänne: T2 suorittaa UPDATE ... WHERE id = 5 -komennon ja tekee sitten commitin, minkä jälkeen T1 lukee rivin 5 uudelleen. Kyseessä on toistumaton luku. T2 suorittaa uuden T1:n WHERE-ehtoon täsmäävän rivin INSERT-komennon, ja T1 suorittaa kyselyn uudelleen. Kyseessä on haamuluku.

Write skew: bonusanomalia

Senioritason haastatteluissa voidaan siirtyä kolmen standardianomalian ohi write skew -tapaukseen: kaksi transaktiota lukee osittain päällekkäisen joukon, tekee lukemansa perusteella toisistaan riippumattomat kirjoitukset ja commitoi ne, jolloin syntyy tila, jota kumpikaan transaktio ei olisi yksin sallinut.

Klassinen esimerkki: kaksi lääkäriä on päivystysvuorossa; kumpikin tarkistaa, että toinen lääkäri on päivystämässä, ja poistuu sitten itse vuorosta. Molemmat onnistuvat, joten päivystykseen ei jää ketään.

Snapshot isolation (Postgresin REPEATABLE READ) sallii write skew -tilanteen; vain SERIALIZABLE estää sen. Tämän mainitseminen osoittaa syvällistä ymmärrystä.

Kadonnut päivitys: neljäs ansa

Haastattelijat ottavat joskus esiin kadonneen päivityksen, joka ei kuulu standardin anomali 목록aan mutta esiintyy käytännössä jatkuvasti. Kaksi transaktiota lukee saman arvon, laskee sen perusteella uuden arvon ja kirjoittaa sen takaisin. Jälkimmäinen kirjoitus korvaa ensimmäisen huomaamatta.

Esimerkki: kaksi rahansiirtoa lukee saldoksi 500, vähentää siitä kumpikin oman summansa ja kirjoittaa tuloksensa. Toinen vähennys katoaa.

Ratkaisuna ei ole pelkästään korkeampi eristystaso, vaan myös eksplisiittinen lukitus komennolla SELECT ... FOR UPDATE tai atominen päivitys, joka laskee arvon tietokannassa sovelluksen sijaan.

-- Safe pattern: lock the row, or compute atomically
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;  -- locks row
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
-- Or simply: UPDATE accounts SET balance = balance - 100 WHERE id = 1;

Pikatesti

Tunnistakaa anomalia sen toiminnan perusteella.

Kertaus: Anomaliat ja niiden korjaaminen

Kolme lukuanomaliaa, joista jokainen korjautuu korkeammalla eristystasolla:

  • Likainen luku (vahvistamattomat tiedot) – korjautuu tasolla READ COMMITTED.
  • Toistumaton luku (olemassa olevan rivin arvo muuttuu) – korjautuu tasolla REPEATABLE READ.
  • Haamuluku (ehtoon täsmäävien rivien joukko muuttuu) – korjautuu tasolla SERIALIZABLE.

Pitäkää selkeä ero toistumattoman luvun ja haamuluvun välillä mielessänne, ja mainitkaa write skew, jos haastattelija haluaa kuulla lisää. Seuraavaksi tarkastelemme, miten tietokantamoottorit käytännössä toteuttavat eristyksen: lukituksia, lukkiutumia ja MVCC:tä.

Aloita maksutta

Opi Valmistautuminen ohjelmointihaastatteluihin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
90
Oppitunnit
360

Usein kysytyt kysymykset

Onko oppitunti ”Likaiset, toistamattomat ja haamulukemat” ilmainen?

Kyllä – oppitunnin ”Likaiset, toistamattomat ja haamulukemat” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Valmistautuminen ohjelmointihaastatteluihin-kurssin, päivitä CoddyKit PROhon. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Likaiset, toistamattomat ja haamulukemat”?

Kolme lukupoikkeamaa ja eristystaso, joka estää kunkin niistä. Harjoittelet Valmistautuminen ohjelmointihaastatteluihin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Valmistautuminen ohjelmointihaastatteluihin-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Valmistautuminen ohjelmointihaastatteluihin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Likaiset, toistamattomat ja haamulukemat”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Valmistautuminen ohjelmointihaastatteluihin-oppitunnilla?

Kyllä. Jokainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. ACID-ominaisuudet selitettynä
  2. Neljä eristystasoa
  3. Likaiset, toistamattomat ja haamulukemat
  4. Umpikujat, lukitseminen ja MVCC
← Takaisin: Valmistautuminen ohjelmointihaastatteluihin