Co takhle to resit jako constraint/trigger v databazi? Jde prece o to,
aby data sedele, tj. abych mel bud nakup a nebo zaznam o stornu. Pokud
mate spravne integritni omezeni v databazi, nemela by se vam takovato
vec stat.
Tom
jeeff napsal(a):
Ahojte,
vo web rozhrani riesim ako zamedzit viacnasobnemu zavolaniu nejakej
metody.
Priklad:
majme metodu pre stornovanie nakupu pri ktorom sa vracia suma za nakup
na ucet nakupujuceho. Je to spravene ako staticka metoda:
public class NakupyDB
{
public static boolean stornoNakup(NakupBean nakup)
{
//najskor skontrolujme ci uz nahodou nie je stornovany
if (nakupBean.isStornovany()) return false;
//vratime sumu na ucet
....
//nastavime ze je to stornovane
nakupBean.setStornovany(true);
//uloz nakup do DB
....
return true;
}
}
Tato metoda je volana z JSP stranky po kliknuti na prislusnu linku.
Chcem zamedzit tomu, ze nakupujuci 2x klikne na linku, pripadne si
otvori stranku v 2 oknach a naraz klikne 2x. V tom pripade by sa mu
suma za nakup mohla vratila viac krat - ak by prvy thread presiel za
test if (nakupBean.isStornovany()) return(false); a potom sa web
server prepol do druheho threadu a ten by sa tiez dostal za tento test.
Ako najjednoduchsie riesenie sa mi zda spravit celu metodu ako
synchronized. Nie je z nej volany ziadny iny synchronized blok, takze
by teoreticky nemalo dojst k deadlocku. Neviem ci by sa ale zamok
spravne odomkol, keby doslo k nejakemu divnemu stavu, napr. Out Of
Memmory alebo nieco podobne.
Padol tu aj navrh o napisani filtra, ktory by neumoznil viac krat
sucasne (pre daneho navstevnika) zavolat rovnake URL.
Akym sposobom taketo situacie riesite vy?