2011-06-22 16 views
8

Chciałbym zrozumieć wykorzystanie transakcji wiosennej z obsługą propagacji. Dokumentacja java wspomina, że ​​jeśli metoda, która ma @Transactional(propagation = Propagation.SUPPORTS) jest wywoływana z poziomu transakcji, obsługuje transakcję, ale jeśli nie istnieje żadna transakcja, metoda jest wykonywana nie-transakcyjnie.Wiosenne transakcje z obsługą Propagacji

Czy to już nie jest zachowanie wiosennych transakcji, niezależnie od Propagation.SUPPORTS?

 


public class ServiceBean { 

    @Transactional(propagation = Propagation.SUPPORTS) 
    public void methodWithSupportsTx() { 
     //perform some database operations 
    } 
} 

public class OtherServiceBean { 

    @Transactional(propagation = Propagation.REQUIRED) 
    public void methodWithRequiredTx() { 
     //perform some database operations 
     serviceBean.methodWithSupportsTx(); 
    } 
} 

 

W powyższym przykładzie kodu, niezależnie od tego, czy methodWithSupportsTx() ma @Transactional(propagation = Propagation.SUPPORTS) adnotacji byłoby wykonywane w ramach transakcji, w zależności od tego, czy methodWithRequiredTx() ma @Transactional adnotacji, prawda?

Więc jaka jest potrzeba/użycie posiadania poziomu propagacji WSPIERA?

Odpowiedz

0

Wymagana transakcja spowoduje utworzenie nowej transakcji, jeśli nie istnieje. Dlatego nowa transakcja byłaby wykonana po wywołaniu serviceBean.methodWithSupportsTx(). Jeśli twoja metoda jest prawdziwie transakcyjna, zobaczysz błąd od wiosny, jeśli nie ma transakcji.

+0

Nie sądzę. Błąd jest zgłaszany tylko wtedy, gdy poziom propagacji jest NIGDY. Również PROPAGATION.SUPPORTS nie tworzy nowej transakcji. –

4

Od javadoc:

Uwaga: Dla menedżerów transakcji z synchronizacją transakcji PROPAGATION_SUPPORTS nieznacznie różni się od braku transakcji w ogóle, jak to określa zakres transakcji, które będą miały zastosowanie do synchronizacji. W konsekwencji te same zasoby (połączenie JDBC, sesja hibernacji itp.) Zostaną udostępnione dla całego określonego zakresu. Zauważ, że zależy to od faktycznej konfiguracji synchronizacji menedżera transakcji.

Tak, oznacza to, że, na przykład, wielokrotne wywołania z Hibernate SessionFactory.getCurrentSession() wewnątrz methodWithSupportsTx() zwróciłby tej samej sesji.

+0

Zakładając, że metodaWithSupportsTx() nie ma adnotacji @Transactional, czy próbujesz powiedzieć, że ta sama sesja NIE zostanie zwrócona, gdy metoda methodWithSupportsTx() zostanie wywołana w transakcji? –

+0

@Amit: W rzeczywistości, bez '@ Transactional' próba wywołania' getCurrentSession() 'z typową konfiguracją' HibernateTransactionManager' spowodowałaby "Brak sesji hibernacji związanej z wątkiem, a konfiguracja nie pozwala na utworzenie tu nietransakcyjnego" wyjątek. – axtavt

+0

Nie Chodziło o to, że jeśli nie ma adnotacji @Transactional w metodzie methodWithSupportsTx() i ta metoda jest wywoływana z innej metody, która już jest w transakcji, nie nastąpi hibernacja zwróci tej samej sesji podczas wykonywania wielu wywołań Hibernate's SessionFactory.getCurrentSession(). To jest dokładnie przykład, który podaję w powyższym pytaniu - adnotacja @Transactional na methodWithRequiredTx() tworzy nową transakcję, a następnie wywołuje serviceBean.methodWithSupportsTx() stąd kod wykonany przez methodWithSupportsTx() byłby już w transakcji, prawda? –