jeśli ktoś może wyjaśnić, co robi ta adnotacja i kiedy dokładnie jej używamy:
@Transactional(propagation=Propagation.REQUIRED)
Dzięki
jeśli ktoś może wyjaśnić, co robi ta adnotacja i kiedy dokładnie jej używamy:
@Transactional(propagation=Propagation.REQUIRED)
Dzięki
Odpowiedzi:
Gdy ustawienie propagacji to PROPAGATION_REQUIRED, logiczny zakres transakcji jest tworzony dla każdej metody, do której jest stosowane ustawienie. Każdy taki logiczny zakres transakcji może indywidualnie określać status tylko do wycofania, przy czym zewnętrzny zakres transakcji jest logicznie niezależny od wewnętrznego zakresu transakcji. Oczywiście w przypadku standardowego zachowania PROPAGATION_REQUIRED wszystkie te zakresy zostaną zmapowane do tej samej fizycznej transakcji. Tak więc znacznik wycofania tylko ustawiony w wewnętrznym zakresie transakcji wpływa na szansę transakcji zewnętrznej na faktyczne zatwierdzenie (tak, jak można się tego spodziewać).
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html
Jeśli potrzebujesz laika wyjaśnienia użycia poza tym, co podano w Spring Docs
Rozważ ten kod ...
class Service {
@Transactional(propagation=Propagation.REQUIRED)
public void doSomething() {
// access a database using a DAO
}
}
Gdy wywoływana jest funkcja doSomething (), wie, że przed wykonaniem musi rozpocząć transakcję w bazie danych. Jeśli obiekt wywołujący tej metody już rozpoczął transakcję, ta metoda użyje tej samej fizycznej transakcji w bieżącym połączeniu z bazą danych.
Ta @Transactional
adnotacja umożliwia poinformowanie kodu podczas wykonywania, że musi mieć transakcję. Bez niego nie będzie działać, więc możesz założyć w swoim kodzie, że nie pozostaniesz z niekompletnymi danymi w bazie danych lub będziesz musiał coś wyczyścić, jeśli wystąpi wyjątek.
Zarządzanie transakcjami to dość skomplikowany temat, więc miejmy nadzieję, że ta uproszczona odpowiedź okaże się pomocna
@Transactional
do swojej warstwy usług, nie ma dalszych wymagań, aby dodawać również @Transactional
metody DAO wywoływane w ramach tej transakcji.
doSomething()
wywołuje inną zagnieżdżoną metodę bez @transactional, czy ta sama transakcja będzie miała również zastosowanie do tej metody wywołującej?
W aplikacjach Spring, jeśli włączysz obsługę transakcji opartą na adnotacjach przy użyciu <tx:annotation-driven/>
i opatrzysz adnotacjami dowolną klasę / metodę za pomocą @Transactional (propagation = Propagation.REQUIRED) to Spring Framework rozpocznie transakcję i wykona metodę oraz zatwierdzi transakcję. Jeśli wystąpił wyjątek RuntimeException, transakcja zostanie wycofana.
Właściwie propagation = Propagation.REQUIRED to domyślny poziom propagacji, nie musisz go jawnie wspominać.
Więcej informacji: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations
Zrozumienie różnych ustawień i zachowań transakcyjnych przyjętych do zarządzania transakcjami, takich jak REQUIRED
:ISOLATION
itd musisz zrozumieć podstawy zarządzania transakcjami samego.
Przeczytaj Zarządzanie Trasaction, aby uzyskać więcej wyjaśnień.