JTA 지원
JTA(Java™ Transaction API) 지원은 JTA 1.1 스펙에 정의된 UserTransaction 인터페이스 외에도 API(Application Programming Interface)를 제공합니다.
- SynchronizationCallback 인터페이스
- ExtendedJTATransaction 인터페이스
- UOWSynchronizationRegistry 인터페이스
- UOWManager 인터페이스
- 스레드와 연관된 글로벌 및 로컬 트랜잭션 ID에 대한 액세스
글로벌 ID는 CosTransactions::PropagationContext: 오브젝트의 트랜잭션 ID에 기초를 두고 있으며 로컬 ID는 로컬 JVM(Java Virtual Machine)에서 고유하게 트랜잭션을 식별합니다.
- 엔터프라이즈 애플리케이션 컴포넌트가 트랜잭션 완료 시 관련성을 등록하는 데
사용할 수 있는 트랜잭션 동기화 콜백
고급 애플리케이션은 트랜잭션 완료 전에 업데이트를 비우고 트랜잭션 완료 후에 상태를 정리하도록 이 콜백을 사용할 수 있습니다. Java EE(및 관련) 스펙은 일반적으로 이 기능을 엔터프라이즈 애플리케이션 컨테이너의 도메인으로 지정합니다.
지속 관리자, 자원 어댑터, 엔터프라이즈 Bean 및 웹 애플리케이션 컴포넌트와 같은 컴포넌트는 JTA 트랜잭션에 등록할 수 있습니다.
다음 정보는 JTA 지원이 제공하는 인터페이스의 개요입니다. 자세한 정보는 생성된 API 문서를 참조하십시오.
SynchronizationCallback 인터페이스
이 인터페이스를 구현하는 오브젝트는 ExtendedJTATransaction 인터페이스를 통해 한 번 등록되며, 트랜잭션 완료에 대한 알림을 수신합니다.
이 인터페이스 구현 오브젝트를 엔터프라이즈 애플리케이션 서버의 Java 플랫폼에서 실행할 수 있지만 이 오브젝트가 호출될 때 활성화되는 특정 엔터프라이즈 애플리케이션 컴포넌트는 없습니다. 따라서 오브젝트는 모든 엔터프라이즈 애플리케이션 자원에 대해 제한된 직접 액세스 권한을 가집니다. 특히, 오브젝트에는 java: 네임스페이스 또는 임의의 컨테이너 조정 자원에 대한 액세스 권한이 없습니다. 이러한 오브젝트는 자신이 위임한 엔터프라이즈 애플리케이션 컴포넌트(예: Stateless 세션 Bean)에 대한 참조를 캐싱할 수 있습니다. 그런 다음, 오브젝트에는 엔터프라이즈 애플리케이션 자원에 대한 모든 일반 액세스 권한이 있어야 합니다. 예를 들어, JDBC(Java Database Connectivity) 연결을 확보하고 beforeCompletion 메소드 중 데이터베이스에 대한 업데이트를 비우는 데 이 오브젝트를 사용할 수 있습니다.
ExtendedJTATransaction 인터페이스
이 인터페이스는 Java EE JTA 지원에 대한 WebSphere® 프로그래밍 모델 확장자입니다. 이 인터페이스를 구현하는 오브젝트는 java:comp/websphere/ExtendedJTATransaction에서 이 인터페이스를 지원하는 WebSphere Application Server의 엔터프라이즈 애플리케이션 컨테이너로 바인드됩니다. EJB(Enterprise JavaBeans) 컨테이너에서 호출될 때 이 오브젝트에 대한 액세스는 컴포넌트 관리 트랜잭션으로 제한되지 않습니다.
ExtendedJTATransaction exJTA = (ExtendedJTATransaction)ctx.lookup("
java:comp/websphere/ExtendedJTATransaction");
SynchronizationCallback sync = new SynchronizationCallback();
exJTA.registerSynchronizationCallback(sync);
- 트랜잭션이 로컬로 시작되든 가져오기되든 간에 애플리케이션 서버에서 실행되는 모든 트랜잭션 끝
- 콜백이 등록된 트랜잭션의 끝

TransactionSynchronizationRegistry 인터페이스
이 인터페이스는 JTA 1.1 스펙에 정의됩니다. 지속 관리자, 자원 어댑터, 엔터프라이즈 Bean 및 웹 애플리케이션 컴포넌트와 같은 시스템 레벨 애플리케이션 컴포넌트는 이 인터페이스를 사용하여 JTA 트랜잭션에 등록할 수 있습니다. 그러 후 예를 들어, 컴포넌트는 트랜잭션이 완료되었을 대 캐시를 비울 수 있습니다.
TransactionSynchronizationRegistry 인터페이스를 확보하려면 java:comp/TransactionSynchronizationRegistry의 JNDI 검색을 사용하십시오.

UOWSynchronizationRegistry 인터페이스
- JTA 트랜잭션
- 로컬 트랜잭션 포함(LTC)
- ActivitySession 컨텍스트
- 특수 순서 지정 시맨틱으로 동기화 오브젝트를 등록합니다.
- 자원 오브젝트와 UOW를 연관시킵니다.
- 현재 UOW의 컨텍스트를 가져옵니다.
- 현재 UOW 상태를 가져옵니다.
- 롤백의 현재 UOW를 표시합니다.
UOWSynchronizationRegistry 인터페이스를 확보하려면 java:comp/websphere/UOWSynchronizationRegistry의 JNDI 검색을 사용하십시오. 이 인터페이스는 서버 환경에서만 사용할 수 있습니다.
// Retrieve an instance of the UOWSynchronizationRegistry interface from JNDI.
final InitialContext initialContext = new InitialContext();
final UOWSynchronizationRegistry uowSyncRegistry =
(UOWSynchronizationRegistry)initialContext.lookup(“java:comp/websphere/UOWSynchronizationRegistry”);
// Instantiate a class that implements the javax.transaction.Synchronization interface
final Synchronization sync = new SynchronizationImpl();
// Register the Synchronization object with the current UOW.
uowSynchronizationRegistry.registerInterposedSynchronization(sync);
UOWManager 인터페이스
UOWManager 인터페이스는 JTA TransactionManager 인터페이스와 동일하며 애플리케이션 서버가 트랜잭션 경계를 관리할 수 있는 메소드를 정의합니다. 애플리케이션은 UOWManager 인터페이스를 사용하여 제품의 UOW 컨텍스트를 조작할 수 있습니다. UOWManager 인터페이스는 WebSphere Application Server가 지원하는 모든 유형의 UOW(즉, JTA 트랜잭션, 로컬 트랜잭션 포함(LTC) 및 ActivitySession 컨텍스트)에 적용됩니다. 애플리케이션 코드는 적절하게 구성된 엔터프라이즈 Bean을 사용하지 않고 특정 유형의 UOW에서 실행될 수 있습니다. 일반적으로 UOW 범위에서 수행되는 로직은 익명의 내부 클래스에서 캡슐화됩니다. 지속 관리자, 자원 어댑터, 엔터프라이즈 Bean 및 웹 애플리케이션 컴포넌트와 같은 시스템 레벨 애플리케이션 서버 컴포넌트는 이 인터페이스를 사용할 수 있습니다.
WebSphere Application Server는 API 또는 SPI(System Programming Interface)에서 TransactionManager 인터페이스를 제공하지 않습니다. UOWManager 인터페이스는 동등한 기능을 제공하나 WebSphere Application Server는 UOW 컨텍스트의 제어 및 무결성을 유지보수합니다.
컨테이너 관리 환경에서 UOWManager 인터페이스를 확보하려면 java:comp/websphere/UOWManager의 JNDI 검색을 사용하십시오. 컨테이너 관리 환경 외부에서 UOWManager 인터페이스를 확보하려면 UOWManagerFactory 클래스를 사용하십시오. 이 인터페이스는 서버 환경에서만 사용할 수 있습니다.
UOWManager 인터페이스를 사용하여 엔터프라이즈 Bean이 아닌 웹 컴포넌트를 사용하지만 UOW에서 제어를 유지하는 웹 애플리케이션을 마이그레이션할 수 있습니다. 예를 들어, 웹 애플리케이션은 현재 UserTransaction 인터페이스를 사용하여 글로벌 트랜잭션을 시작하고, 지원되지 않는 것으로 구성된 세션 엔터프라이즈 Bean에서의 메소드 호출이 일부 비트랜잭션 작업을 수행하도록 한 후 글로벌 트랜잭션을 완료합니다. 세션 EJB 메소드에서 캡슐화된 로직을 UOWAction 구현의 실행 메소드로 이동할 수 있습니다. 그러면 세션 엔터프라이즈 Bean을 호출하는 웹 컴포넌트의 코드를 UOWManager 인터페이스의 runUnderUOW 메소드에 대한 호출로 바꿔 이 로직이 로컬 트랜잭션에서 실행되도록 요청합니다. 이러한 방법으로 UOW를 통해 원래 애플리케이션과 동일한 레벨의 제어를 유지보수합니다.
// Retrieve an instance of the UOWManager interface from JNDI.
final InitialContext initialContext = new InitialContext();
final UOWManager uowManager = (UOWManager)initialContext.lookup("java:comp/websphere/UOWManager");
try
{
// Invoke the runUnderUOW method, indicating that the logic should be run in a global
// transaction, and that any existing global transaction should not be joined, that is,
// the work must be performed in the scope of a new global transaction.
uowManager.runUnderUOW(UOWSynchronizationRegistry.UOW_TYPE_GLOBAL_TRANSACTION, false, new UOWAction()
{
public void run() throws Exception
{
// Perform transactional work here.
}
});
}
catch (UOWActionException uowae)
{
// Transactional work resulted in a checked exception being thrown.
}
catch (UOWException uowe)
{
// The completion of the UOW failed unexpectedly. Use the getCause method of the
// UOWException to retrieve the cause of the failure.
}