자카르타 트랜잭션

Jakarta Transactions

자카르타 EE API 중 하나인 자카르타 트랜잭션(JTA, 이전 Java 트랜잭션 API)을 사용하면 Java 환경에서 여러 X/Open XA 리소스에 걸쳐 분산 트랜잭션을 수행할 수 있습니다.JTA는 Java Community Process에서 JSR 907로 개발된 규격입니다.JTA는 다음을 제공합니다.

X/Open XA 아키텍처

X/Open XA 아키텍처에서는 트랜잭션 매니저 또는 트랜잭션 처리 모니터(TP 모니터)가 데이터베이스 및 메시지 큐와 같은 여러 리소스에 걸쳐 트랜잭션을 조정합니다.각 리소스에는 고유한 리소스 관리자가 있습니다.일반적으로 리소스 관리자에는 관계형 데이터베이스와 함께 작동하도록 JDBC API와 같이 리소스를 조작하기 위한 API는 JDBC API입니다.또한 자원 매니저는 TP 모니터가 자신의 자원 매니저와 다른 자원 매니저 간의 분산 트랜잭션을 조정할 수 있도록 합니다.마지막으로, TP 모니터와 통신하여 트랜잭션을 시작, 커밋 또는 롤백하는 애플리케이션이 있습니다.또한 응용 프로그램은 자체 API를 사용하여 개별 리소스와 통신하여 리소스를 수정합니다.

X/Open XA 아키텍처의 JTA 구현

JTA API는 다음 2개의 Java 패키지로 클래스로 구성됩니다.

JTA는 X/Open XA 아키텍처를 기반으로 모델링되지만 트랜잭션 경계를 정의하기 위해 두 개의 다른 API를 정의합니다.EJB 서버와 같은 애플리케이션 서버와 애플리케이션 구성요소를 구분합니다.인터페이스를 제공합니다.javax.transaction.TransactionManager응용 프로그램서버가 트랜잭션을 시작, 커밋 및 롤백하기 위해 사용합니다.다른 인터페이스를 제공합니다.javax.transaction.UserTransactionservlet 또는 EJB와 같은 일반 클라이언트 코드에 의해 트랜잭션 관리에 사용됩니다.

JTA 아키텍처에서는 각 자원 매니저가 구현해야 합니다.javax.transaction.xa.XAResourceTP 모니터에 의해 관리되도록 인터페이스를 설정합니다.앞서 설명한 바와 같이 각 리소스에는 다음과 같은 고유한 API가 있습니다.

응용 프로그램 프로그래밍 인터페이스

Jakarta Transactions API는 고급 응용 프로그램 트랜잭션 구분 인터페이스, 응용 프로그램 서버용 고급 트랜잭션 관리자 인터페이스 및 트랜잭션 리소스 관리자를 위한 X/Open XA 프로토콜의 표준 Java 매핑의 세 가지 요소로 구성됩니다.

User Transaction 인터페이스

javax.transaction.UserTransaction인터페이스는 트랜잭션 경계를 프로그래밍 방식으로 제어할 수 있는 기능을 응용 프로그램에 제공합니다.이 인터페이스는 Java 클라이언트 프로그램 또는 EJB 빈에서 사용할 수 있습니다.

UserTransaction.begin()method는 글로벌트랜잭션을 시작하여 해당 트랜잭션을 호출 스레드와 연관짓습니다.트랜잭션과 스레드 간 연결은 트랜잭션 관리자에 의해 투명하게 관리됩니다.

중첩 트랜잭션 지원은 필요하지 않습니다.User Transaction(사용자 트랜잭션)begin 메서드는 Not Supported를 슬로우합니다.호출 스레드가 트랜잭션과 이미 연결되어 있고 트랜잭션 관리자 구현이 중첩된 트랜잭션을 지원하지 않는 경우 예외입니다.

응용 프로그램 간의 트랜잭션 컨텍스트 전파는 클라이언트 및 서버 머신에 구현된 기본 트랜잭션 매니저를 통해 제공됩니다.전파에 사용되는 트랜잭션 컨텍스트 형식은 프로토콜에 따라 다르므로 클라이언트와 서버 호스트 간에 협상해야 합니다.예를 들어 트랜잭션 매니저가 JTS 사양의 구현인 경우 CORBA OTS 1.1 사양에 지정된 트랜잭션 컨텍스트 전파 형식을 사용합니다.트랜잭션 전파는 애플리케이션 프로그램에 대해 투명합니다.

@트랜잭션 주석

javax.transaction.Transactional주석은 응용 프로그램에 트랜잭션 경계를 선언적으로 제어할 수 있는 기능을 제공합니다.이 주석은 자카르타 EE 규격에서 관리되는 빈(CDI 관리되는 빈 포함)으로 정의된 모든 클래스에 적용할 수 있습니다.

다음 코드 샘플은 요청 범위 CDI 관리 대상 빈에서 @Transactional을 사용하는 방법을 보여 줍니다.

@RequestScoped(요구범위) 일반의 학급 예 콩 {      @트랜잭션     일반의 무효 후우() { // 트랜잭션이 활성 상태입니다.                  // 작업을 하다      } // 메서드가 반환한 후 트랜잭션이 커밋되거나 롤백됩니다. } 

트랜잭션 동작은 주석의 속성을 통해 구성할 수 있습니다.사용 가능한 옵션은 EJB 사양의 옵션과 매우 유사합니다.

@TransactionScope 주석

javax.transaction.TransactionScoped주석은 응용 프로그램에 빈이 존재하는 범위가 특정 트랜잭션이 활성화되는 시간과 연관되어 있음을 선언하는 기능을 제공합니다.

다음 코드 샘플은 CDI 관리 대상 빈 요청에서 @TransactionScoped의 사용 방법을 보여 줍니다.

@트랜잭션 범위 일반의 학급 TxScoped Bean {     일반의 인트 번호;      일반의 인트 get Number(번호)() {돌아가다 번호;}     일반의 무효 set Number(세트 번호)(인트 번호) {이것..번호 = 번호;} }  @RequestScoped(요구범위) 일반의 학급 예 콩 {      @인젝트     사적인 TxScoped Bean txScoped Bean;      @트랜잭션     일반의 무효 후우() {         txScoped Bean.set Number(세트 번호)(1);     }      @트랜잭션     일반의 무효 막대기() {         시스템..나가..인쇄물(tXscoped Bean.get Number(번호)());     } } 

처음에 ExampleBean의 관리 인스턴스에서 메서드 foo()가 호출된 후 메서드 bar()가 호출된 경우 인쇄된 번호는 1이 아니라 0이 됩니다.이는 각 메서드가 자체 트랜잭션을 가지고 있기 때문에 TxScopedBean의 자체 인스턴스가 있기 때문입니다.따라서 foo()에 대한 콜 중에 설정된 번호1은 bar()에 대한 콜 중에 표시되지 않습니다.

EJB 서버에서의 UserTransaction 지원

EJB 서버는 EJB 빈에서 사용할 UserTransaction 인터페이스를 지원해야 합니다.javax.ejb.TransactionManagement주석(Bean Managed Transactions(BMT; 빈 관리 트랜잭션)이라고 부릅니다).UserTransaction 인터페이스는 getUserTransaction 메서드를 사용한EJBContext 인터페이스 또는 General을 사용한 주입을 통해 직접 EJB 컴포넌트에 노출됩니다.@Resource주석입니다.따라서, EJB 애플리케이션은 트랜잭션 정의를 위해 트랜잭션 관리자와 직접 상호 작용하지 않습니다. 대신, EJB bean은 자카르타 엔터프라이즈 빈 사양에 정의된 모든 트랜잭션 작업을 지원하기 위해 EJB 서버에 의존합니다.(EJB 서버와 TM 간의 기본적인 상호 작용은 애플리케이션에 대해 투명합니다. 트랜잭션 관리 구현에 대한 부담은 EJB 컨테이너와 서버 공급자에게 있습니다.)[1]

다음 코드 샘플은 EJB 세션 bean에서 bean 관리 트랜잭션을 통한 UserTransaction의 사용을 보여 줍니다.

@스테이트리스 @ 트랜잭션 관리() 일반의 학급 예 콩 {      @리소스     사적인 사용자 트랜잭션 utx;      일반의 무효 후우() {         // 트랜잭션 시작         utx.시작한다.();          // 작업을 하다          // 커밋         utx.저지르다();     } } 

UserTransaction은 SessionContext에서 얻을 수도 있습니다.

@스테이트리스 @ 트랜잭션 관리() 일반의 학급 예 콩 {      @리소스     사적인 세션 컨텍스트 ctx;      일반의 무효 후우() {         사용자 트랜잭션 utx = ctx.get User Transaction(사용자 트랜잭션)();          // 트랜잭션 시작         utx.시작한다.();          // 작업을 하다          // 커밋         utx.저지르다();     } } 

단, 위의 예에서는 다음과 같은 경우에 주의해 주십시오.@TransactionManagement(BEAN)주석이 생략되고 JTA 트랜잭션이 자동으로 시작됩니다.foo()호출되어 자동으로 커밋 또는 롤백됩니다.foo()종료됩니다.따라서 EJB 프로그래밍에서는 UserTransaction을 사용할 필요가 없지만 매우 특수한 코드에서는 필요할 수 있습니다.

JNDI에서의 User Transaction 지원

User Transaction은 다음 위치에서 사용할 수 있습니다.java:comp/UserTransaction(JTA 실장이 환경에 설치되어 있는 경우).

「 」를 참조해 주세요.

레퍼런스

외부 링크