Novo

Forum kao aplikacija na telefonu

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

konkurentno izvrsavanje sp, transakcija i deadlock

  • 4 odgovora
  • 3.343 pregleda

Najnovija ↓

konkurentno izvrsavanje sp, transakcija i deadlock 16.10.2007. u 23:52 · pre 231 mesec #1
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?!?!
Re: konkurentno izvrsavanje sp, transakcija i deadlock 19.11.2007. u 09:42 · pre 230 meseci #3
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
Potpis
S poštovanjem
Re: konkurentno izvrsavanje sp, transakcija i deadlock 19.11.2007. u 18:15 · pre 230 meseci #4
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()
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme