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?





Odpovedet emailem