javax.transaction.Transactional 및 org.springframework.transaction.annotation.Transactional


152

주석 javax.transaction.Transactional과 의 실제 차이점이 무엇인지 이해하지 못합니다 org.springframework.transaction.annotation.Transactional.

인가 org.springframework.transaction.annotation.Transactional의 확장 javax.transaction.Transactional또는 완전히 다른 의미를 가지고? 각각 언제 사용해야합니까? @Transactinal서비스 계층의 스프링 과 DAO의 javax ?

대답 해줘서 고마워.

답변:


125

Spring은 몇 년 전 Spring bean 메소드를 트랜잭션 방식으로 만들기 위해 자체 트랜잭션 주석을 정의했습니다.

Java EE 7은 마침내 동일한 작업을 수행했으며 이제 EJB 메소드 외에도 CDI Bean 메소드를 트랜잭션 처리 할 수 ​​있습니다. 따라서 Java EE 7부터 자체 트랜잭션 주석을 정의합니다 (Spring 주석을 재사용 할 수는 없음).

Java EE 7 애플리케이션에서는 Java EE 주석을 사용합니다.

Spring 애플리케이션에서는 Spring 주석을 사용합니다.

컨테이너 (Java EE 또는 Spring)에 메소드가 트랜잭션임을 알리는 사용법도 동일합니다.


28
그 이상 : 우주를 지배하기 위해 스프링은 암시 적 지원을 추가 javax.transaction.Transactional하여 이제 추가 조치없이 스프링 애플리케이션에서도 사용할 수 있습니다. IMO, 이것은 내 경험으로 인해 많은 개발자들이 코드 에서이 두 가지를 혼동없이 혼동하여 나중에 문제를 야기하기 때문에 디자인 관점에서 볼 때 매우 나쁜 결정이었습니다 .
Yuriy Nakonechnyy

16
또한org.springframework.transaction.annotation.TransactionalreadOnlytimeoutjavax.transaction.Transactional
pierrefevrier

1
@ 유라, 어떤 문제가 관찰 되었습니까?
이치 ​​키암

1
@LeeCheeKiam 아래 두 가지 답변을 참조하십시오
Yuriy Nakonechnyy

50

또 다른 차이점은 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.

9
나는 이것이 Spring 4.2.0에서 더 이상 문제가되지 않는다고 생각한다 : javax.transaction.Transactional 주석은 Spring 자체 주석의 대체 대체물 로서도 지원된다
Arend v. Reinersdorff

예를 들어 개인 방법으로 사용하는 경우 항상 사용되는 것은 아닙니다.
휴지통

36

조심하십시오 (이 문제는 바람둥이에서 발생했습니다)

응용 프로그램이 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]

1
참고 :이 답변은 제 답변의 특별한 경우입니다
Jidehem

3

선언적 거래 범위

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정의를 사용할 때 분리 레벨 구성이 어떻게 다른지에 대한 자세한 내용은 이 기사를 확인 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.