[ mvasicdo @ 14.03.2007. 07:56 ] @
Pozdrav svima...

Interesuje me sledece:
Da li se moze desiti da ako u trenutku izvrsenja nekog SQL upita na SQL-ovu (SQL 2005 Express) bazu nestane struje ili nesto slicno sto ce mi naglo odvojiti aplikaciju od baze, da mi u tom trenutku "pukne" baza tako da kasnije ne mogu doci do podataka. Postoje li neke mjere zastite koje to sprecavaju.
Da li se ova zastita treba odraditi na nivou aplikacije ili samog servera.

Konkretno, radim u C#-u, i interesuje me da li se ova zastita moze odraditi na nivou aplikacije.
[ IDeveloper @ 14.03.2007. 09:36 ] @
Najbolje je da cuvas transakciju i ako dodje do greske da uradis rollback

evo ti primera za Sql
:

Code:



DECLARE @BRTRANSAK INT
SET @BRTRANSAK=@@TRANCOUNT

IF @@TRANCOUNT>0
   SAVE TRAN PRENOS
ELSE
   BEGIN TRAN PRENOS

BEGIN TRY

-- Ovde tvoj stavis Sql statement

-- Ovde potvrdis
IF @BRTRANSAK = 0 COMMIT TRAN PRENOS

END TRY

BEGIN CATCH

ROLLBACK TRAN PRENOS

END CATCH


[Ovu poruku je menjao mmwc dana 15.03.2007. u 09:06 GMT+1]

[Ovu poruku je menjao mmix dana 15.03.2007. u 15:48 GMT+1]
[ mmix @ 14.03.2007. 11:20 ] @
@IDeveloper: ako coveku nestane struje usred transakcije, rollback ce slabo sta da uradi tu

@mvasicdo: u principu, ne brini za nestanak struje. cak i single-sql statement se izvrsavaju u okviru konteksta implicitne transakcije i bivaju upisane u log pre same promene (Write-Ahead Logging protocol iliti WAL), a sql ima mehanizme da proveri da li je stanje tabela u skladu sa commited transakcijama iz loga i moze da 'premota' bazu unapred u stabilno stanje u skladu sa logom. Doduse to je teorija, u praksi postoje neke razlike koliko dobro taj sistem funkcionise i to zavisi od hardvera na sql serveru; na primer da HD kontroler i HD imaju dovoljno 'snage' da IO kes izbace na medijum pre obaranja diska; jeftini tajvanac sa citavih svojih 8mb kesa garantuje obicno upis samo jednog sektora , skupi serverski diskovi i kontroleri garantuju upisivanje celog HD kesa od 16 i vise MB pa tu u pricu ulazi i power adapter itd, itd. U svakom slucaju imas ovaj tekst o onome sto tebe interesuje i razne tehnologije koje SQL server koristi za "ocuvanje" integriteta podataka:
SQL Server 7.0, SQL Server 2000, and SQL Server 2005 logging and data storage algorithms extend data reliability
Description of caching disk controllers in SQL Server
Description of using disk drive caches with SQL Server that every database administrator should know


Sto se tice same aplikacije, nakon pada baze stici ce ti jedan SqlException sa porukom koja ce zavisiti od trentuka pucanja. Generalno, osim ako ti aplikacija nije multi-database to treba da dovede do "gracefull" pada aplikacije.
[ IDeveloper @ 14.03.2007. 11:27 ] @
Ne znam da sam pominjao da je ovo zastita od nestanka struje! Za to sluzi UPS!
U naslovu teme je "pucanje"! Ne mogu bas sve do slova i bukvalno da objasnjavam!

[Ovu poruku je menjao mmwc dana 15.03.2007. u 09:07 GMT+1]
[ mmix @ 14.03.2007. 13:53 ] @
Citat:
IDeveloper: Ne znam da sam pominjao da je ovo zastita od nestanka struje! Za to sluzi UPS!
U naslovu teme je "pucanje"! Ne mogu bas sve do slova i bukvalno da objasnjavam!


wow
ok, da ne bi bilo zabune, niko ne ocekuje ni od koga ovde da sve do slova objasnjava, ucesce ovde je dobrovoljno i po broju poruka i po detaljnosti; ali ono sto se definitivno ocekuje od svakog je da ne odgovara na naslove poruka nego na pitanje koje je postavljeno u poruci. Ono sto tebi predstavlja "pucanje" ne mora drugima da ima isto znacenje; meni npr. 'pucanje baze' ima totalno drugacije znacenje od 'pucanja sql statement-a' koje se resava rollbackom.

I kad smo vec kod rollback-a, off topic, snimanje transaction checkpoint-a i nasledjivanje parent transakcije (ako postoji) koje radis u kodu koji si okacio je nepreporucljivo, nested transakcije savrseno dobro rade posao i obezbedjuju atomicity cele transakcije. Koriscenje save pointa u "nizoj" transakciji razbija "sve ili nista" koncepciju vise transakcije i ti u nizoj transakciji odlucujes da li je za visu transakciju prihvatljivo ili ne da neka niza transakcija ne odradi posao i da se pretvara da je sve ok. Ovo je narocito vazno ako je ceo taj SQL posao samo deo DCOM MTS transakcije ili slicnog high level mehanizma u kome mozda drugi deo MTS transakcije zavisi od toga dali je ta niza transakcija odradila posao kako treba, svi ce se pretvarati da je sve ok, a commit-ovano stanje distribuiranog sistema ce postati nestabilno. Ovaj kod je npr ekvivalentan gutanju Exception-a u .NET-u i postoji dobar razlog zasto rollback "unistava" celu hijerarhiju transakcije a ne samo svoju nested instancu. Ako si sa druge strane prisiljen da koristis save point kao jedino resenje to je prva indikacija da dizajn aplikacije/baze nije dobar.


PS: Kad vidis da si napravio propust u svojoj poruci, gledaj da umesto da uradis copy/paste cele poruke u novu poruku uradis izmenu svoje postojece poruke, narocito ako je poruka sa kilometarskim kodom.
[ vladdy @ 16.03.2007. 14:17 ] @
Svaki iole normalan server ima UPS koji ce da drzi dok se na normalan nacin ne ugasi server sa sve db-om.

Sto se tice samog pitanja, to se radi na database nivou, tesko ces uraditi nesto vise iz .NET aplikacije. Mislim da je pitanje primerenije database forumu, naravno u zavisnosti koji db koristis kao back-end.