Podle me tu nejde ale o nakupni kosik, ale o to, aby z uctu neodesly
penize dvakrat. A to si opravdu myslim ze je integritni omezeni a ne
zalezitost business logiky. Navic napsat trigger, ktery se zavola
vzdycky pri stornu objednavky a podiva se, jestli je na storno narok je
celkem jednoducha vec.
Na urovni business logiky/web ui pak uz jenom jednoduse odchytite
patricnou exception a tu pak ukazete uzivateli (samozrejme bez
stacktrace ;-))...
Tom
Mirek Stohr napsal(a):
Ja to resil pres ulozen objektu nakupniho kosiku do session uzivatele,
plus synchronized metoda aby ji nemohl volat dokud nedobehla. Pokud ma
dve okna prohlizece, jsou to dve session, takze problem nevznikne --
nakupni kosiky ma taky dva, a stornuje kazdy zvlast. A session
listener v metode sessionDestroyed() kosik automaticky vysype, pokud
v nem tedy neco je. Pokud padne cely server kvuli OutOfMemoryError,
tak to pravd. bude vetsi problem a bude se to muset resit "rucne".
Funguje to zatim celkem dobre :-))
Mirek
Tomas Hubalek napsal(a):
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?