Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Transakcije i kurzori

[es] :: MS SQL :: Transakcije i kurzori

[ Pregleda: 2746 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

flighter_022
L2 Applications Administrator
NS

Član broj: 18499
Poruke: 737
..1.41.client3.directonpc.com.

ICQ: 23089150


+232 Profil

icon Transakcije i kurzori24.05.2008. u 03:48 - pre 193 meseci
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?
 
Odgovor na temu

M E N E
borislav
Temerin

Član broj: 30434
Poruke: 231
93.86.61.*



+1 Profil

icon Re: Transakcije i kurzori24.05.2008. u 09:03 - pre 193 meseci
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)


Uhvatili ste me nespremnog
 
Odgovor na temu

flighter_022
L2 Applications Administrator
NS

Član broj: 18499
Poruke: 737
41.204.224.*

ICQ: 23089150


+232 Profil

icon Re: Transakcije i kurzori24.05.2008. u 13:03 - pre 193 meseci
Videh to u dokumentaciji ali sam mislio da mozda postoji jednostavnije resenje.

Hvala.
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
212.200.243.*



+104 Profil

icon Re: Transakcije i kurzori25.05.2008. u 00:10 - pre 193 meseci
možeš da probaš i sa

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


nisam 100% siguran da će raditi, ali
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

flighter_022
L2 Applications Administrator
NS

Član broj: 18499
Poruke: 737
41.204.224.*

ICQ: 23089150


+232 Profil

icon Re: Transakcije i kurzori25.05.2008. u 14:28 - pre 193 meseci
Ovo vredi probati.
 
Odgovor na temu

Koce
DBA
Serbia, Belgrade

Član broj: 59217
Poruke: 144
*.vektor.net.



+1 Profil

icon Re: Transakcije i kurzori26.05.2008. u 12:19 - pre 193 meseci
mislim da nece, jer ce pri prvoj gresci on uraditi rollback!
moraces koristiti try - catch.....
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Transakcije i kurzori27.05.2008. u 08:53 - pre 193 meseci
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

Viva lollapalooza
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
82.117.202.*



+171 Profil

icon Re: Transakcije i kurzori27.05.2008. u 10:34 - pre 193 meseci
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.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Transakcije i kurzori27.05.2008. u 10:38 - pre 193 meseci
Naravno ....
@@ERROR promenljiva se "resetuje" pri svakom sledecem izvrsavanju nekog inserta,update-a i delete-a

Viva lollapalooza
 
Odgovor na temu

Koce
DBA
Serbia, Belgrade

Član broj: 59217
Poruke: 144
*.vektor.net.



+1 Profil

icon Re: Transakcije i kurzori27.05.2008. u 15:01 - pre 193 meseci
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
 
Odgovor na temu

[es] :: MS SQL :: Transakcije i kurzori

[ Pregleda: 2746 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.