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

Odpovedet emailem