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