Nie rozumiem, jaka jest rzeczywista różnica między adnotacjami javax.transaction.Transactional
a org.springframework.transaction.annotation.Transactional
?
Czy org.springframework.transaction.annotation.Transactional
jest przedłużeniem, javax.transaction.Transactional
czy też mają zupełnie inne znaczenie? Kiedy należy użyć każdego z nich? Wiosna @Transactinal
w warstwie serwisowej i javax w DAO?
Dzięki za odpowiedź.
javax.transaction.Transactional
czemu można go było teraz używać również w aplikacjach Spring bez żadnych dodatkowych działań. IMO, była to dość zła decyzja z punktu widzenia projektowania , ponieważ z mojego doświadczenia wynika, że wielu programistów nieświadomie myli te dwa elementy w swoim kodzie, co prowadzi do późniejszych problemów.org.springframework.transaction.annotation.Transactional
oferuje więcej opcji (takich jakreadOnly
,timeout
) niżjavax.transaction.Transactional
Inną różnicą jest sposób, w jaki Spring obsługuje adnotacje @Transactional
javax.ejb.TransactionAttribute
jest dostępna w ścieżce klas (od wersji 2.5.3 do 3.2.5). W ten sposób możesz skończyć z nieuwzględnianiem adnotacji, jeśli tylkojavax.transaction.Transactional
znajdują się one w Twojej ścieżce klas, a niejavax.ejb.TransactionAttribute
. Może tak być, jeśli pracujesz z Hibernate: hibernate-core (4.3.7.Final) zależy od jboss-transaction-api_1.2_spec (1.0.0.Final), która nie zapewniajavax.ejb.TransactionAttribute
.źródło
Proszę bądź ostrożny (ten problem wystąpił w Tomcat),
Jeśli Twoja aplikacja jest aplikacją internetową WIOSNA i używasz mechanizmu obsługi transakcji Springa
@org.springframework.transaction.annotation.Transactional
, to nie mieszaj go z javax.transaction.Transactional.To jest Zawsze używaj,
@org.springframework.transaction.annotation.Transactional
konsekwentnie w aplikacji sprężynowej.W przeciwnym razie możemy skończyć z tym błędem,
źródło
Deklaratywny zakres transakcji
@Transaction
Adnotacja Spring i JPA pozwalają na zdefiniowanie zakresu transakcji danej aplikacji.Tak więc, jeśli metoda usługi jest opatrzona
@Transactional
adnotacją, będzie działać w kontekście transakcyjnym. Jeśli metoda usługi korzysta z wielu DAO lub repozytoriów, wszystkie operacje odczytu i zapisu reklam zostaną wykonane w tej samej transakcji bazy danych.Wiosna
@Transactional
org.springframework.transaction.annotation.Transactional
Adnotacji jest dostępna od wersji 1.2 ramach wiosennej (około 2005 roku), a to pozwala na ustawienie następujących właściwości transakcyjnych:isolation
: poziom izolacji bazowej bazy danychnoRollbackFor
oraznoRollbackForClassName
: listaException
klas Java , które można wyzwolić bez wyzwalania wycofania transakcjirollbackFor
orazrollbackForClassName
: listaException
klas Java , które wyzwalają wycofanie transakcji po wyrzuceniupropagation
: typ propagacji transakcji podany przezPropagation
Enum. Na przykład, jeśli kontekst transakcji można odziedziczyć (np.REQUIRED
) Lub należy utworzyć nowy kontekst transakcji (np.REQUIRES_NEW
) Lub jeśli należy zgłosić wyjątek, jeśli nie ma kontekstu transakcji (np.MANDATORY
) Lub jeśli należy zgłosić wyjątek jeśli zostanie znaleziony bieżący kontekst transakcji (npNOT_SUPPORTED
.).readOnly
: czy bieżąca transakcja powinna tylko odczytywać dane bez wprowadzania zmian.timeout
: przez ile sekund kontekst transakcji powinien działać, zanim zostanie zgłoszony wyjątek limitu czasu.value
lubtransactionManager
: nazwaTransactionManager
ziarna Spring, która ma być używana podczas wiązania kontekstu transakcji.Java EE
@Transactional
javax.transaction.Transactional
Adnotacja dodano specyfikacją Java EE 7 (około 2013). Tak więc adnotacja Java EE została dodana 8 lat później niż jej odpowiednik Spring.Java EE
@Transactional
definiuje tylko 3 atrybuty:dontRollbackOn
: listaException
klas Java , które można wyzwolić bez wyzwalania wycofania transakcjirollbackOn
: listaException
klas Java , które powodują wycofanie transakcji podczas wyrzucaniavalue
: strategia propagacji, podana przezTxType
Enum. Na przykład, jeśli kontekst transakcji można odziedziczyć (np.REQUIRED
) Lub należy utworzyć nowy kontekst transakcji (np.REQUIRES_NEW
) Lub jeśli należy zgłosić wyjątek, jeśli nie ma kontekstu transakcji (np.MANDATORY
) Lub jeśli należy zgłosić wyjątek jeśli zostanie znaleziony bieżący kontekst transakcji (npNOT_SUPPORTED
.).Który wybrać?
Jeśli używasz Spring lub Spring Boot, użyj
@Transactional
adnotacji Spring , ponieważ pozwala ona skonfigurować więcej atrybutów niż@Transactional
adnotacja Java EE .Jeśli używasz samego Java EE i wdrażasz swoją aplikację na serwerze aplikacji Java EE, użyj adnotacji Java EE `` @ Transactional`.
źródło