wątki,transakcje,daosy,uslugi...

0

Witam, krążę na razie po googlu i takich tam i szukam informacji na temat transakcji. chodzi mi o taki przypadkek:

działają sobie wątki, które mogą wykonywać usługi biznesowe, które przez obiekt dao modyfikują sobie jakieś tam dane.

chcę użyć springa i hibernate i nie jest łatwo to wszystko posklejać do kupy :)

ogolnie moja koncepcja jest taka:

a) tworzę obiekty usług( np usługa odejmująca coś z jednego konta i dodająca do drugiego) - to oczywiście musi wykonać się transakcyjnie, albo wszystko albo nic

b) w tych usługach umieszczam obiekty dao (z applicationContext)

c) tworzę obiekty Dao( dziedziczę po HibernateDaoSupport, przekazuje SessionFactory z applicationContext)

d) tworzę coś w stylu fasady, gdzie znajdują się metody wykonujące uslugi z pkt1;

e) w applicationContext tworzę

  • menadzera transakcji HibernateTransactionManager( czy moze JtaTransactionManager - czym się to rozni )

  • bean po klasie TransactionProxyFactoryBean ( jako target ustawiam tą moją klasę z metodami -fasadę, dla wszytkich metod ustawiam ISOLATION.SERIALIZABLE)

  • dataSource,sessionFactory,daoImpl

Ogólnie jakoś tak to widzę, tylko pojawia się parę wątpliwości :) :

  1. chcę, aby każda usługa wykonywała się jako transakcja z takim poziomem izolacji,aby żadna inna usluga nie mogła być wywołana - czy tak zaprojektowany system będzie tak działał ?

  2. mam sobie wywołaną usługę biznesową i teraz chcę chcę wykonać np 2 operacje na obiecie dao:

    • DAO.szukaj (bleble)
    • sprawdz/zmien/blebleble
    • DAO.zapisz(ble)
      Czy to zadziała tak jak należy w ramach transakcji i zostanie commitnięte po wykonaniu metody z fasady ?
  3. wszystkie obiekty mają być singletonami w takim przypadku ?

  4. wszelkie inne uwagi, lepsze rozwiązanie, propozycje ...

z góry dzięki, jak mi się coś jeszcze przypomni to dorzucę bo układanka tego wszystkiego nie jest na początku łatwa :)

0
  1. Hibernate zawsze używa transakcji w opcji pesymistycznej co oznacza maksymalną izolację
  2. Tak
  3. Singletowatość zapewnia spring w swojej bean factory. Jak tworzysz beana w applicationContext.xml:
<bean name="webDao" class="org.example.dao.WebDAOImpl" >
</bean>

to możesz go stworzyć niesingletonem:

<bean name="webDao" class="org.example.dao.WebDAOImpl" singleton="false">
</bean>
  1. Metoda nie jest zła

Co do różnic pomiędzy HibernateTransactionManager i JtaTransactionManager to ten drugi jest przeznaczony dla frameworków JTA. należy zatem używać Hibernatowego TM do Hibernata. Zresztą oba należą do jednej nad klasy:
AbstractPlatformTransactionManager

Każdy rodzaj popularnej usługi ma tam odpowiednią klasę. Uwaga! Hibernate ma dwa obiekty jeden dla H3 i jeden dla starszych wersji.

0

ale wydawalo mi sie ze to co kolega opisuje (odnosnie pkt 1 o transakcyjnosci) to jemu chodzi o serializowanie transakcji, a hibernate domyslnie dziala zdaje sie w read commited. jesli chce wyzszy poziom izolacji to powinien zmienic jednen z propertisow w konfigu hibernate, ale to juz nie pamietam jaki (wartosci sa 1, 2, 4, 8 zdaje sie, serializable to 8, read commited to 2)

pessimistic locking tylko dokonuje lockowania zasobow na starcie transakcji, nie oznacza serializowanego podejscia do transakcji

jednakze calkowita, najwyzsza izolacja jest prawie zawsze zlym pomyslem, zle sie skalujacym itp, lepiej uzywac domyslnego i jesli trzeba to wlasnie uzywac pesimistick locking (w api hb to jest Session.lock(object, LockMode czy tam LockStyle)

pozdro

0

read_commited - ale czy uniknę wtedy sytuacji takiej:

startuje transakcja A:
-odczyt danych gracza
-cos sie tam prawda robi w tej usłudze...(powiedzmy sprawdza czy ma dosc kasy, żeby móc zagrać, odejmujemy tą kase)

w momencie gdy transakcja A odczytała dane gracza i odejmuje kase to wystartowała transakcja B, odczytała taki sam stan kasy jak stransakcja A.

i co tearaz ? A.commit , B.commit ? jaki wynik? ...


z innej beki :)

gdy tworzę obiekty usług zawierające obiekt dao, to za każdym razem powinienem zrobić

fasada:jakas tam metoda:

Service service = applicationContext.getBean("my"+service.className");
no i np:
service.start(params);

a nie jak to w przykładach spotykam Service service = new Service() - wtedy kontener springa nie ma nic wspolnego z tworzeniem tego obiektu,tak?

0

na w takiej sytuacji wlasnie przydaje sie lockowanie zasobow - kazda inna transakcja bedzie czekac az sie zwolnia - testowalem, wyglada to tak ze dana transakcja w bazie danych czeka az sie zasoby zwolnia i dopiero startuje dalej - nie ma zatem mozliwosci sytauacji tzw lost last update czy podobnych

1 użytkowników online, w tym zalogowanych: 0, gości: 1