[java] javax.transaction.Transactional 및 org.springframework.transaction.annotation.Transactional

주석 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: 기본 데이터베이스 격리 수준
  • noRollbackFornoRollbackForClassName: 자바의 목록 Exception트랜잭션 롤백을 유발하지 않고 트리거 할 수있는 클래스
  • rollbackForrollbackForClassName: 자바의 목록 Exception트랜잭션 롤백을 트리거 클래스는 경우에 슬로우되는
  • propagation: PropagationEnum에서 제공 한 트랜잭션 전파 유형 예를 들어, 트랜잭션 컨텍스트가 상속 될 수 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: TxTypeEnum 에서 제공 한 전파 전략 . 예를 들어, 트랜잭션 컨텍스트가 상속 될 수 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정의를 사용할 때 분리 레벨 구성이 어떻게 다른지에 대한 자세한 내용은 이 기사를 확인 하십시오 .


답변