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?!?!