Onko teilläkin sellainen tunne, että transaktioiden erotustasot (isolation levels) ovat huonosti selitettyjä jokaisessa oppimateriaalissa, mistä ikinä olette niihin tutustuneet? Että selityksen kyllä tajuaa, mutta loppujen lopuksi jää kuitenkin sellainen olo, että ei ehkä osaisi valita sopivaa erotustasoa sovellukselleen (paitsi ehkä että serializable ainakin toimii)?
Syy on oikeastaan siinä, ettei kukaan tiedä, mitä mikään muu transaktioiden erotustaso kuin serializable tarkoittaa. En ole löytänyt varsinaista ANSI/ISO-standardia, jossa ne on määritelty, mutta standardiin tehtyjen viittausten perusteella olen tullut siihen tulokseen, että standardi jättää ne aivan hillittömästi alimääritellyiksi.
Törmäsin tähän konkreettisesti, kun yritin selvittää, mikä erotustaso riittää, jos haluan estää kahta transaktiota päivittämästä rinnakkain saman taulun samaa riviä, mutta en tarvitse mitään muita takeita esim. eri rivien lukemisten ja kirjoittamisten ristiinvaikutuksista toisiinsa. Ongelma, jonka haluan estää, on ns. "lost update". ANSI/ISO-määrityksistä ei voi mitenkään päätellä, mikä taso sen estää. Niissä on määritelty kukin taso kolmella tavalla:
Ellei ota vapaata kuvausta huomioon, edes "serializable"-taso ei oikeasti tarjoa mitään järkevää suojaa lähes mitään vastaan. Muista tasoista on oikeasti vaikea päätellä, mitä ne edes tekevät. Ongelmallisista ilmiöistä voi päätellä vähän, mitä huonoja juttuja voi tapahtua, mutta niistä on vaikea arvata, mitä kaikkia muita huonoja juttuja voi tapahtua.
Mitä tämä tarkoittaa käytännössä? Että ei ole olemassa mitään tietokantariippumatonta koodia, joka käyttää jotain muuta transaktiotasoa kuin "ei mitään takeita" (eli mikä tahansa), "kaikki takeet" (serializable) tai "read only". Serializableenkaan ei voi luottaa, mikäli ottaa standardin vakavasti, ja olen kuullut huhuja, että esimerkiksi Oraclen serializable ei oikeasti ole sitä, eikä muistaakseni estä esim. write skew'ta. Eri transaktiotasojen vaikutus pitää aina tarkistaa käyttämänsä DBMS:n dokumentaatiosta.
Yrittäessäni etsiä lisää tietoa eri transaktiotasoista törmäsin tähän artikkeliin, joka mielestäni kertoo hyvin mainitsemiani ongelmia:
https://blog.acolyer.org/2016/02/24/a-critique-of-ansi-sql-isolation-levels/
atehwa: Postgresillä on suhteellisen hyvä dokumentaatio tästä: