@Transactional (propagation = Propagation.REQUIRED)

107

jeśli ktoś może wyjaśnić, co robi ta adnotacja i kiedy dokładnie jej używamy:

@Transactional(propagation=Propagation.REQUIRED)

Dzięki

Adil
źródło
3
Propagation.REQUIRED to domyślny tryb propagacji Transaction, więc nie musisz go jawnie ustawiać.
tibtof

Odpowiedzi:

65

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ć).

wprowadź opis obrazu tutaj

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html

Guido
źródło
167

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 @Transactionaladnotacja 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

Ćwiek
źródło
jeśli używa konfiguracji opartej na proxy do deklarowania i uzyskiwania dostępu do warstwy DAO, metoda w klasie DAO również musi być opatrzona adnotacją @Transactional.
Kurapika
Jeśli dodałeś @Transactionaldo swojej warstwy usług, nie ma dalszych wymagań, aby dodawać również @Transactionalmetody DAO wywoływane w ramach tej transakcji.
Brad
jeśli 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?
thisarattr
Tak, o ile ten sam wątek jest używany do wykonywania metody zagnieżdżonej (tj. Nie tworzysz jawnie nowego wątku). Dzieje się tak, ponieważ transakcje Spring są powiązane z bieżącym wątkiem przy użyciu zmiennych ThreadLocal
Brad,
15

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

K. Siva Prasad Reddy
źródło
5

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ń.

Mapa bitowa
źródło