in

mscommunity.net

Interactive mscommunity.net online activities

data.hr

Myths&legends

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

Published ruj 25 2007, 06:17 by dvitner
Filed under:

Comments

 

petar.repac said:

>Dakle, transakcija sama po sebi ne jamči ništa, ...

Pa jamči upravo ACI i D :))

Stvar je u tome da nam se konzistentnost podataka pojavljuje u više nivoa. Ako određena poslovna pravila implementiramo u kodu izvan baze onda je taj kod odgovoran da baza ostane u konzistentnom stanju, što opet znači da taj kod mora upravljati sa transakcijama.

Consistency u ACID se odnosi na deklarativne constrainte, recimo foreign key ili check constraint. Generalno baza može dozvoliti da je određeni constraint prekršen u vrijeme izvođenja transakcije, ali u trenutku commit-a mora sve biti OK.

Petar

rujan 25, 2007 12:59
 

dvitner said:

Nazalost, constrainti se provjeravaju za svaki pojedini statement, što je ustvari jedan od problema, IMO:

use tempdb;

go

create table parent (c1 int primary key, c2 varchar(10) not null);

go

create table child (c1 int primary key, c2 int not null constraint fk_parent foreign key references parent(c1));

go

begin tran

insert child values (1, 1);

insert parent values (1, 'qwre');

commit

A inace, slažemo se da baza može biti stvarno konzistentna samo ako su svi constrainti izraženi deklarativno :)

rujan 25, 2007 11:08
 

petar.repac said:

Da, SQL Server ne podržava "deferred constraints"

rujan 26, 2007 5:21
Powered by Community Server (Commercial Edition), by Telligent Systems