Ahoj,
ono to nie je take jednoduce ako sa zda, to ze ide o storno nakupu je
len priklad. Naviac nedeju sa tam len operacie nad databazou ale aj ine
operacie. Preto ma nezaujimalo riesenie na urovni databazy, ale riesenie
na urovni business logiky.
Nechcel som riesit ziadne zamykanie databazy a podobne veci. Naviac ja
to storno objednavky mozem v databaze nastavit, az ked mi zbehne kopec
business logiky pred tym.
Takze znova opakujem, storno nakupu je len priklad, moze to byt cokolvek
co nechcem aby sa cez web rozhranie dalo zavolat 2x nez to zbehne cele
do konca. Vobec to nemusi pracovat s databazou. Riesite taketo veci,
alebo si poviete, ze taka situacia nenastane a kaslete na to?
Tomas Hubalek wrote:
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?
--
jeeff