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

konkurentno izvrsavanje sp, transakcija i deadlock

[es] :: MS SQL :: konkurentno izvrsavanje sp, transakcija i deadlock

[ Pregleda: 2446 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

gewra
Ivan Djuric
Beograd

Član broj: 43205
Poruke: 31
*.adsl-3.sezampro.yu.



Profil

icon konkurentno izvrsavanje sp, transakcija i deadlock16.10.2007. u 22:52 - pre 200 meseci
Problem je sledeci:

Imam dve tabele, tabelu A koja pored ostalih podataka ima i kolonu bId koja je tipa int i ustvari predstavlja fk kolone id u tabeli B, pri cemu je to i primary key sa identity-jem tabele B.

Imam SP koja treba da upise red u B, izvuce id iz B (ustvari trenutnu vrednost identity-ja) i upise podatke u A zajedno sa izvucenim id-jem.
Ukoliko ne uspe upis u A mora rollback iz B.

Do sada sam imao

begin transaction
insert into B(.......)
if (@@error<>0)
begin
rollback
return -1
end

select @maxBId=max(id) from B

insert into A(....,@maxBId)
if (@@error<>0)
begin
rollback
return -1
end
commit

E sad ovo sve lepo radi dok sp ne pozovem konkurento iz npr 50 niti istovremeno (realni case bi bio oko 500 konkurentnih napada)

Jasno je da naredba select @maxBid=max(id) from B ustvari pravi problem i da zbog nje dolazi do deadlock-a na tabeli B.

Jedno resenje je da spojim ove dve tabele u jednu, ali to zahteva puno refaktorisanja, a pri tome i nije neko programersko resenje. Ima neko drugi predlog?!?!
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
*.intens.co.yu.

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: konkurentno izvrsavanje sp, transakcija i deadlock17.10.2007. u 10:14 - pre 200 meseci
Umesto

select @maxBId=max(id) from B

stavi
select @maxBId = SCOPE_IDENTITY()
Every hamster has his day.
 
Odgovor na temu

adopilot
Admir Hodžić
It menager
Sarajevo BiH

Član broj: 123492
Poruke: 134
217.199.133.*

Sajt: nemam ja to


Profil

icon Re: konkurentno izvrsavanje sp, transakcija i deadlock19.11.2007. u 08:42 - pre 199 meseci
Probaj dodati na kraju prve transakcije

SET @maxBId=@@identity

gdije je @@identity sistemska varijabla koja zapisuje zadnji ubačeni PK u neku tablicu.

Lijep pozdrav
S poštovanjem
 
Odgovor na temu

Teks

Član broj: 153636
Poruke: 31
77.46.221.*



Profil

icon Re: konkurentno izvrsavanje sp, transakcija i deadlock19.11.2007. u 17:15 - pre 199 meseci
teoretski

SET @maxBId=@@identity

može da ne vrati ono što očekujemo (vrati PK od neku druge tabele sa kojom radi neko drugi)
ovo bi bilo interesantno probati simulirati ...

držite se što je rekao Fedya i nećete pogrešiti

select @maxBId = SCOPE_IDENTITY()
 
Odgovor na temu

M E N E
borislav
Temerin

Član broj: 30434
Poruke: 231
*.nspoint.net.



+1 Profil

icon Re: konkurentno izvrsavanje sp, transakcija i deadlock20.11.2007. u 12:24 - pre 199 meseci
da, SCOPE_IDENTITY() je bolje resenje...
Uhvatili ste me nespremnog
 
Odgovor na temu

[es] :: MS SQL :: konkurentno izvrsavanje sp, transakcija i deadlock

[ Pregleda: 2446 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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