주석 javax.transaction.Transactional
과 의 실제 차이점이 무엇인지 이해하지 못합니다 org.springframework.transaction.annotation.Transactional
.
인가 org.springframework.transaction.annotation.Transactional
의 확장 javax.transaction.Transactional
또는 완전히 다른 의미를 가지고? 각각 언제 사용해야합니까? @Transactinal
서비스 계층의 스프링 과 DAO의 javax ?
대답 해줘서 고마워.
답변
Spring은 몇 년 전 Spring bean 메소드를 트랜잭션 방식으로 만들기 위해 자체 트랜잭션 주석을 정의했습니다.
Java EE 7은 마침내 동일한 작업을 수행했으며 이제 EJB 메소드 외에도 CDI Bean 메소드를 트랜잭션 처리 할 수 있습니다. 따라서 Java EE 7부터 자체 트랜잭션 주석을 정의합니다 (Spring 주석을 재사용 할 수는 없음).
Java EE 7 애플리케이션에서는 Java EE 주석을 사용합니다.
Spring 애플리케이션에서는 Spring 주석을 사용합니다.
컨테이너 (Java EE 또는 Spring)에 메소드가 트랜잭션임을 알리는 사용법도 동일합니다.
답변
또 다른 차이점은 Spring이 @Transactional 주석을 처리하는 방법입니다
- org.springframework.transaction.annotation.Transactional 은 항상 고려됩니다
- javax.transaction.Transactional 은 EJB3 트랜잭션이 존재하는 경우에만 고려됩니다. EJB3 트랜잭션의 존재는
javax.ejb.TransactionAttribute
클래스 경로에서 클래스 가 사용 가능한지 (버전 2.5.3에서 3.2.5까지) 확인하여 수행됩니다 . 따라서javax.transaction.Transactional
클래스 패스 에만 있고 아닌 경우 주석을 고려 하지 않을 수javax.ejb.TransactionAttribute
있습니다. Hibernate로 작업하는 경우에 해당 할 수 있습니다 : hibernate-core (4.3.7.Final)는 jboss-transaction-api_1.2_spec (1.0.0.Final)에 의존하지 않습니다javax.ejb.TransactionAttribute
.
답변
조심하십시오 (이 문제는 바람둥이에서 발생했습니다)
응용 프로그램이 SPRING 웹 응용 프로그램이고 Spring의 트랜잭션 처리 메커니즘 인을 @org.springframework.transaction.annotation.Transactional
사용하는 경우 javax.transaction.Transactional과 혼합하지 마십시오.
@org.springframework.transaction.annotation.Transactional
스프링 애플리케이션에서 항상 일관되게 사용됩니다.
그렇지 않으면이 오류가 발생할 수 있습니다.
org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed
........
Caused by: java.sql.SQLException: Protocol violation: [0]
답변
선언적 거래 범위
Spring과 JPA @Transaction
주석을 사용하면 주어진 응용 프로그램 트랜잭션의 범위를 정의 할 수 있습니다.
따라서 서비스 메소드에 주석으로 @Transactional
주석 이 달린 경우 트랜잭션 컨텍스트에서 실행됩니다. 서비스 방법이 여러 DAO 또는 리포지토리를 사용하는 경우 모든 읽기 광고 쓰기 작업은 동일한 데이터베이스 트랜잭션에서 실행됩니다.
봄 @Transactional
org.springframework.transaction.annotation.Transactional
주석 (2005 년경) 스프링 프레임 워크의 1.2 버전부터 사용할 수 있으며, 그것은 다음과 같은 트랜잭션 속성을 설정할 수 있습니다 :
isolation
: 기본 데이터베이스 격리 수준noRollbackFor
과noRollbackForClassName
: 자바의 목록Exception
트랜잭션 롤백을 유발하지 않고 트리거 할 수있는 클래스rollbackFor
과rollbackForClassName
: 자바의 목록Exception
트랜잭션 롤백을 트리거 클래스는 경우에 슬로우되는propagation
:Propagation
Enum에서 제공 한 트랜잭션 전파 유형 예를 들어, 트랜잭션 컨텍스트가 상속 될 수REQUIRED
있거나 (예 🙂 새 트랜잭션 컨텍스트가 작성되어야하는 경우 (예 🙂REQUIRES_NEW
또는 트랜잭션 컨텍스트가MANDATORY
없거나 (예 🙂 예외가 발생하는 경우 예외가 발생해야하는 경우 현재 트랜잭션 컨텍스트가 발견되는 경우 (예를 들면NOT_SUPPORTED
).readOnly
: 현재 트랜잭션이 변경 사항을 적용하지 않고 데이터를 읽어야하는지 여부입니다.timeout
: 제한 시간 초과 예외가 발생할 때까지 트랜잭션 컨텍스트를 몇 초 동안 실행할 수 있어야합니까?value
또는transactionManager
:TransactionManager
트랜잭션 컨텍스트를 바인딩 할 때 사용될 Spring Bean 의 이름 .
자바 EE @Transactional
javax.transaction.Transactional
주석 (2013 년경) 자바 EE 7 사양으로 추가되었습니다. 따라서 Java EE 주석은 8 년 후 Spring에 추가되었습니다.
Java EE @Transactional
는 3 가지 속성 만 정의합니다.
dontRollbackOn
:Exception
트랜잭션 롤백을 트리거하지 않고 트리거 할 수있는 Java 클래스 목록rollbackOn
:Exception
발생시 트랜잭션 롤백을 트리거하는 Java 클래스 목록value
:TxType
Enum 에서 제공 한 전파 전략 . 예를 들어, 트랜잭션 컨텍스트가 상속 될 수REQUIRED
있거나 (예 🙂 새 트랜잭션 컨텍스트가 작성되어야하는 경우 (예 🙂REQUIRES_NEW
또는 트랜잭션 컨텍스트가MANDATORY
없거나 (예 🙂 예외가 발생하는 경우 예외가 발생해야하는 경우 현재 트랜잭션 컨텍스트가 발견되는 경우 (예를 들면NOT_SUPPORTED
).
어느 것을 선택해야합니까?
Spring 또는 Spring Boot를 사용하는 경우 Spring @Transactional
주석을 사용하면 Java EE @Transactional
주석 보다 더 많은 속성을 구성 할 수 있습니다 .
Java EE 만 사용하고 Java EE 응용 프로그램 서버에 응용 프로그램을 배포하는 경우 Java EE“@Transactional ”주석을 사용하십시오.
Spring 또는 Java EE
@Transactional
정의를 사용할 때 분리 레벨 구성이 어떻게 다른지에 대한 자세한 내용은 이 기사를 확인 하십시오 .