Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 9 odgovora
  • 3.667 pregleda

Najnovija ↓

Transakcije i kurzori 24.05.2008. u 04:48 · pre 224 meseca #1
Procedura prvo dodaje slogove u bazu (primer) a zatim preko kurzora radi dodatnu obradu sa upisivanjem u neku trecu tabelu

Code:
BEGIN TRAN

DECLARE @p1 int, @p2 int

INSERT INTO Tabela1
                    (Polje1,
                    Polje2)
SELECT          Abc,
                    Def
FROM            Tabela2
WHERE          <neki uslov>

DECLARE        cursor1 CURSOR FOR
SELECT         Tabela1.Polje1, Tabela1.Polje2
FROM          Tabela1
WHERE        <neki uslov>
   
OPEN cursor1

FETCH    NEXT From Cursor1
INTO    @p1, @p2

WHILE    @@FETCH_STATUS =0
BEGIN
    <neka obrada podataka>    
    FETCH    NEXT From Cursor1
        INTO    @p1, @p2
END
CLOSE        cursor2
DEALLOCATE    cursor2
COMMIT TRAN


E sad, ako tokom dela gde se koristi kurzor dodje do greske, podaci upisani sa INSERT INTO ipak ostanu u bazi (jer u tom delu nije bilo greske). Kako da postignem da sve izmene u bazi (i one sa INSERT INTO, i one unutar kurzorske operacije) budu obuhvacene istom transakcijom?
Re: Transakcije i kurzori 24.05.2008. u 10:03 · pre 224 meseca #2
hm
predlazem ti da koristis try-catch blok
pa da brises ako dodje do greske
(mozda je glupavo resenje, ali prvo mi je palo na pamet)

Potpis
Uhvatili ste me nespremnog
Re: Transakcije i kurzori 24.05.2008. u 14:03 · pre 224 meseca #3
Videh to u dokumentaciji ali sam mislio da mozda postoji jednostavnije resenje.

Hvala.
Re: Transakcije i kurzori 25.05.2008. u 01:10 · pre 224 meseca #4
možeš da probaš i sa

Code:
BEGIN TRAN
....
IF @@ERROR = 0 
COMMIT TRAN
else
rollback


nisam 100% siguran da će raditi, ali
Potpis
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
Re: Transakcije i kurzori 26.05.2008. u 13:19 · pre 224 meseca #6
mislim da nece, jer ce pri prvoj gresci on uraditi rollback!
moraces koristiti try - catch.....
Re: Transakcije i kurzori 27.05.2008. u 09:53 · pre 224 meseca #7
Citat:
Koce: mislim da nece, jer ce pri prvoj gresci on uraditi rollback!
moraces koristiti try - catch.....


Pa to je i poenta RollBack transakcije da vrati sve izmene koje su napravljene ..
Mora da prodju svi INSERT-i ili nijedan ako sam dobro shvatio odavde :

Citat:
@flighter_022
E sad, ako tokom dela gde se koristi kurzor dodje do greske, podaci upisani sa INSERT INTO ipak ostanu u bazi (jer u tom delu nije bilo greske). Kako da postignem da sve izmene u bazi (i one sa INSERT INTO, i one unutar kurzorske operacije) budu obuhvacene istom transakcijom?


Ako koristis SQL2000 onda ces morati da testiras sa @@ERROR jer
ako radis na SQL2005 onda mozes koristiti i TRY-CATCH

Pogledaj na ovom linku imas error handling u stored procedurama :
http://www.4guysfromrolla.com/webtech/041906-1.shtml
Potpis
Viva lollapalooza
Re: Transakcije i kurzori 27.05.2008. u 11:34 · pre 224 meseca #8
Pazite sa tom @@ERROR promenljivom, problem moze biti ako se ne proverava svaki upit, jer recimo:

Code:

BEGIN TRAN

INSERT T1 -- ovde je recimo error, samo ova klauzula puca, ne cela transakcija

INSERT T2 

IF @ERROR = 0 
  COMMIT TRAN -- uradice se commit, jer prethodni insert nije generisao gresku
ELSE
  ROLLBACK TRAN




Koristite SET XACT_ABORT ili TRY CATCH ili @ERROR ali onda proveravajte svaku klauzulu.
Re: Transakcije i kurzori 27.05.2008. u 11:38 · pre 224 meseca #9
Naravno ....
@@ERROR promenljiva se "resetuje" pri svakom sledecem izvrsavanju nekog inserta,update-a i delete-a
Potpis
Viva lollapalooza
Re: Transakcije i kurzori 27.05.2008. u 16:01 · pre 224 meseca #10
ma da, sad sam vidio da on u stvari hoce da se izbirse i ono sto je insertovao, ja sam mislio da to ne zeli da mijenja.... rollback ce sigurno sve da vrati na pocetno
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme