Citat:
johnnyc: Naime, imam transakciju. Nju prvo upisujem u TRL, pa u cache. Nakon neceg sto se zove "kontrolna tacka", sve se upisuje u bazu.
Kada kazem "sve se upisuje u bazu", mislim da se upisuje fizicki na disk, dakle u mdf ili u ndf fajl.
Dakle jos jednom, kada sam upisao u TRL, a jos nisam upisao u bazu, sve se upisuje u cache. Tek nakon toga, dolazi do upisivanja u bazu. Kada se upise u bazu, postavlja se checkpoint, koji oznacava da sve sto je do tada bilo u cache-u, konacno upisano i na disk.
Pa nije bas toliko jednosatvno, ali nije ni daleko. U principu entiteti u mdf file sistemu su podeljeni na stranice (page) i svaka od stranica je podlozna kesiranju u memoriji i svaka promena se radi ovim redosledom:
1. Upisuje u memorijski kes TRLa (vrh loga je uvek kesiran u memoriji)
2. Upisuje u kesiranoj stranici u memoriju (prvo je kesira ako nije tu) usput generisuci lockove na odredjenom nivou granulacije (to je druga prica)
Posto SQL koristi write-ahead log, kad se radi flushovanje kesa na disk (sto se ne podudara sa commit/rollbackom transakcija) redom se:
1. Flushuje TRL
2. Flushuju commited stranice
3. Udara checkpoint "pecat" u TRL i isti se trunc-uje ako je recovery model = simple.
U principu nista ne ulazi u data files a da se operacija pre toga ne zabelezi u TRLu bilo fizicki bilo u kesu. To sluzi za roll-forward popravku data fajlova ako server pukne u drugom koraku, kad se digne sledeci put krece se provera od poslednjeg checkpointa i odreadjuje korak 2 za sve transakcije (s tim sto se nezatvorene transakcije rollbackuju). Takodje obrati paznju da se uncommited stranice ne izbacuju iz cache-a (da se izbacuju bilo bi nemoguce spreciti dirty-read efekat jer stara kopija vise ne bi postojala) dok se TRL kes operacije koja je "isprljala" page svejedno mora da ode na disk TRL zbog sekvencijalnog poretka operacija.
Citat:
johnnyc:
Lako moze da se desi, da zadam upit, a da podaci jos nisu upisani u fajl (onaj gore koji sam spomenuo). Ako bih u tom slucaju zadao upit nad podacima, sve bi se korektno selektovalo, jer ako jos uvek nije zapisano na disku, imam ga u cache-u.
Ne da lako moze nego se to stalno i desava

. Tacan odgovor na to sta se desava i ciji select ce sta da vrati u ovakvim situacijama zavisi od stepena izolacije transakcije i trenutnih aktivnih lockova. Tebi, kao nosiocu transakcije, ce se uvek vratiti ono sto je u kesu (uncommited) ali drugima ne mora, ako je izolacija npr takva da je iskljucen dirty read, dobice staru verziju stranice sa diska.
Pogledaj ovaj link za vise detalja:
Isolation Levels in the Database Engine