Mitovi i legende (o SQL Serveru, ne o kralju Arturu) su izgleda popularna tema ovih dana. Na privatnoj MVP news grupi je nedavno bio jedan prilično opsežan thread o njima. Maciej Pilecki je upravo danas popodne radio Myths&legends workshop ovdje u Cavtatu. Marko Čulo radi predavanje u subotu na codecampu na tu temu.
Što se misli kad se kaže "mitovi i legende"? Uglavnom se ima na umu neke manje-više netočne tvrdnje koje kruže community-jem, a koje su zbog same svoje dugovječnosti i upornosti dobile status neslužbenih "istina". Neke od njih su zabavne, neke prilično opasne, ali niti jedna od njih nije istinita.
Nemam namjeru nabrajati ovdje te mitove. Pojavite se u subotu na codecampu, odslušajte Markovo predavanje, i čut ćete. Ali, danas mi je palo na pamet nešto što još do sada nigdje nisam čuo ni pročitao - a legenda je, po definiciji.
Naime, kad govorimo o transakcijama, obično imamo na umu onu kraticu ACID - atomicity, consistency, isolation, durability. Consistency se obično definira kao svojstvo transakcije da iza sebe (commit ili rollback, svejedno) ostavi bazu u logički konzistentnom stanju. I to se onda obično ilustrira primjerom da kao neka banka prebacuje neki iznos novaca s jednog računa na drugi, i to se realizira kroz dva odvojena INSERTa: jedan kojim skidamo novac s računa A i drugi kojim stavljamo taj isti iznos na račun B. A transakcija ovdje znači da će oba INSERTa, ako ih "zatvorimo" u transakciju i odradimo barem nekakav osnovni error checking, proći kao jedan, ili pasti kao jedan, dakle "all or nothing".
To je jasno, i u čemu je problem? Problem je u tome tko definira što je tu logička konzistentnost podataka. U ovom slučaju, to definira aplikacija. Aplikacija isto tako može (pogrešno) reći da želi s računa A skinuti 1000, a na račun B staviti 2000. Ili recimo izvršiti samo jedan INSERT. Da li je i tom slučaju baza podataka ostavljena u logički konzistentnom stanju? Možda, iako bi se moglo reći da nije :) Da li baza zna da li je u konzistentnom stanju ili nije? Nema pojma. Zašto nema pojma? Zato što ovo poslovno pravilo, koje kaže da iznos novca koji se skida s jednog računa mora biti identičen iznosu koji se stavlja na drugi račun, nije izraženo deklarativno, nego je (ako je) realizirano samo programski.
Dakle, transakcija sama po sebi ne jamči ništa, barem u ovakvom slučaju kad je poslovno pravilo realizirano na ne-deklarativan način. Transakcija je ovdje samo mehanizam koji je na raspolaganju programeru da osigura da se nekoliko (ne)ovisnih upita izvršava kao jedna logička jedinica, i ne puno više od toga.
Pozdrav, čujemo se.
Dean