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

konkurentno izvrsavanje sp, transakcija i deadlock

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

[ Pregleda: 656 | Odgovora: 4 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

gewra
Ivan Djuric
Beograd

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



Profil

icon konkurentno izvrsavanje sp, transakcija i deadlock16.10.2007. u 22:52

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?!?!
16.10.2007. u 22:52 

Fedya
Fedor Hajdu
Senior Software Engeneer, Ammado Internet Services
Dublin // Novi Sad

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

Jabber: fedya@elitesecurity.org
Sajt: www.ammado.com


Profil

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

select @maxBId=max(id) from B

stavi
select @maxBId = SCOPE_IDENTITY()
while ( ! ( succeed = try() ) );
17.10.2007. u 10:14 

adopilot
Admir Hodžić
Sarajevo BiH

Član broj: 123492
Poruke: 65
217.199.133.*

Sajt: nemam ja to


Profil

icon Re: konkurentno izvrsavanje sp, transakcija i deadlock19.11.2007. u 08:42
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
19.11.2007. u 08:42 

Teks

Član broj: 153636
Poruke: 31
77.46.221.*



Profil

icon Re: konkurentno izvrsavanje sp, transakcija i deadlock19.11.2007. u 17:15
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()
19.11.2007. u 17:15 

M E N E
borislav
Temerin

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



Profil

icon Re: konkurentno izvrsavanje sp, transakcija i deadlock20.11.2007. u 12:24
da, SCOPE_IDENTITY() je bolje resenje...
Uhvatili ste me nespremnog
20.11.2007. u 12:24 

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

[ Pregleda: 656 | Odgovora: 4 ]

Postavi temu Odgovori

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