로컬 트랜잭션 포함
IBM® WebSphere® Application Server는 LTC(Local Transaction Containment)를 지원하며, 로컬 트랜잭션 확장 배치 디스크립터를 사용하여 구성할 수 있습니다. LTC 지원은 애플리케이션 프로그래머에 대한 특정 이점을 제공합니다. 제공된 시나리오 및 고려할 사항 목록을 이용하여 로컬 트랜잭션에 대한 트랜잭션 지원을 구성할 수 있는 최선의 방법을 결정하는 데 도움이 됩니다.
다음 섹션은 LTC 지원이 제공하는 이점 및 각 상황에서 로컬 트랜잭션 확장 배치 디스크립터를 설정하는 방법을 설명합니다.
- 독립적이며 조정이 필요 없는 하나 이상의 데이터베이스에 액세스하는 엔터프라이즈 Bean 또는 서블릿을 개발할 수 있습니다.
- 엔터프라이즈 Bean이 글로벌 트랜잭션을 사용하지 않아도 되는 경우,
컨테이너 트랜잭션 유형의 배치 디스크립터가 Required 대신 NotSupported로 설정되어 Bean을 배치하는 것이
보다 효율적입니다.
애플리케이션 서버의 확장 로컬 트랜잭션 지원으로, 애플리케이션은 글로벌 트랜잭션에서 수행할 수 있는 로직과 같은 비즈니스 로직을 불특정 트랜잭션 컨텍스트에서 수행할 수 있습니다. 예를 들어, NotSupported 또는 Never 유형의 컨테이너 트랜잭션으로 배치되는 경우, 엔터프라이즈 Bean은 불특정 트랜잭션 컨텍스트에서 실행합니다.
확장 로컬 트랜잭션 지원은 컨테이너 관리, 내재적 트랜잭션 경계를 제공하며, 경계 내에서 컨테이너는 애플리케이션 업데이트를 커미트하고 연결을 정리합니다. 배치 문제로 애플리케이션을 보다 독립적으로 디자인할 수 있습니다. 예를 들어, 비즈니스 로직이 글로벌 트랜잭션 컨텍스트를 포함하거나 또는 포함하지 않고 호출될 수 있는 경우, 지원 유형의 컨테이너 트랜잭션 사용을 더 단순하게 만듭니다.
애플리케이션이 트랜잭션에서 실행 되는지 여부에 상관 없이, 애플리케이션은 연결 사용의 get-use-close 패턴을 따를 수 있습니다. 애플리케이션은 모든 상황에서 동일한 방식으로 동작하는 닫기 조치에 따라 다를 수 있습니다. 즉, 글로벌 트랜잭션이 없는 경우 닫기 조치로 연결에서 롤백이 발생하지 않습니다.
다중 자원 관리자의 ACID 조정이 필요하지 않는 여러 시나리오가 있습니다. 이러한 시나리오에서, NotSupported의 정책에서 비즈니스 로직을 실행하면 Required의 정책에서보다 더 효율적입니다. ContainerAtBoundary에 대한 Resolver 속성의 로컬 트랜잭션 섹션에서 배치 디스크립터 설정을 통해 이 이점이 적용됩니다. 이 설정으로, 데이터베이스와 같이 자원 제공자와의 애플리케이션 상호작용은 컨테이너가 시작하고 끝나는 내재적 RMLT(Resource Manager Local Transactions) 내에서 관리됩니다. 컨테이너는 로컬 트랜잭션 섹션의 Boundary 속성에서 지정된 제약 경계(메소드의 끝과 같은)에 RMLT를 커미트합니다. 애플리케이션이 예외로 컨테이너에 대한 제어를 리턴하는 경우, 컨테이너는 시작된 RMLT를 롤백합니다.
이 사용법은 서블릿과 엔터프라이즈 Bean 모두에 적용됩니다.
- 정리를 보증하는 관리 환경에서 로컬 트랜잭션을 사용할 수 있습니다.
- 명시적으로 시작하고 종료하여 RMLT를 제어하려고 하는 애플리케이션은 로컬 트랜잭션 섹션에서
분석기 확장 배치 디스크립터에 대한 애플리케이션의 기본 설정을 사용할 수 있습니다. 이 경우 컨테이너는 로컬 트랜잭션 컨텍스트의
연결 정리를 확인합니다.
로컬 트랜잭션의 애플리케이션 사용을 설명하는 엔터프라이즈 애플리케이션용 Java™ 플랫폼 스펙은 로컬 트랜잭션 섹션에서 분석기 확장 배치 디스크립터용 애플리케이션 및 분석되지 않은 조치 확장 배치 디스크립터용 롤백에서 제공된 방식으로 이를 수행합니다. 로컬 트랜잭션 섹션에서 분석되지 않은 조치 확장 배치 디스크립터가 커미트로 설정되면 컨테이너는 애플리케이션이 시작한 RMLT를 커미트하지만 로컬 트랜잭션 제약이 종료되면(예를 들어 메소드가 종료되면) 완료되지 않습니다. 이 사용법은 서블릿과 엔터프라이즈 Bean 모두에 적용됩니다.
EJB 컴포넌트 메소드의 기간을 초과하여 로컬 트랜잭션의 기간을 확장할 수 있습니다.
EJB(Enterprise JavaBeans) 스펙은 단일 EJB 메소드로 RMLT의 사용을 제한합니다. 이 제한은 디바이스의 범위를 컨테이너 적용된 메소드 경계를 넘어 RMLT를 확장할 수 있는 범위까지의 스펙이 없기 때문입니다. 로컬 트랜잭션 섹션에서 경계 확장 배치 설정을 사용하여 다음 이점을 제공할 수 있습니다.
- RMLT의 유스 케이스를 상당히 확장합니다.
- ActivitySession 지원을 통해 1단계 자원 관리자와의 대화 상호작용을 가능하게 합니다.
ActivitySession을 사용하여 단일 메소드보다 긴 경계로 분산 컨텍스트를 제공할 수 있습니다. RMLT의 사용을 더 긴 ActivitySession 경계보다 확장할 수 있으며, 클라이언트가 제어할 수 있습니다. ActivitySession 경계는 다중 자원의 ACID 조작이 필요하지 않은 분산 트랜잭션의 필요성을 줄입니다. 이러한 이점은 ActivitySession의 로컬 트랜잭션 섹션에서 경계 확장 배치 설정을 통해 적용됩니다. 이러한 확장 RMLT는 로컬 트랜잭션 섹션의 분석기 배치 디스크립터의 설정에 따라 그대로 애플리케이션의 제어를 받거나 컨테이너에서 관리할 수 있습니다.
- 복수의 1단계 자원 관리자를 조정할 수 있습니다.
- XA 트랜잭션 조정을 지원하지 않는 자원 관리자의 경우, 클라이언트는 ActivitySession-바인드된 로컬 트랜잭션 컨텍스트를 사용할 수 있습니다. 클라이언트가 트랜잭션 자원 관리자에 대해 제공한 것과 같이, 이러한 컨텍스트는 자원 관리자로 자원 업데이트의 완료 방향을 제어하는 동일한 기능을 클라이언트에 제공합니다. 클라이언트는 ActivitySession을 시작하고 해당 컨텍스트에서 엔티티 Bean을 호출할 수 있습니다. 이 bean은 해당 ActivitySession의 범위 내에서 RMLT를 수행하고 RMLT를 완료하지 않고 리턴할 수 있습니다. 클라이언트는 나중에 커미트나 롤백 방향에서 ActivitySession을 완료할 수 있어 컨테이너가 조정된 방향으로 ActivitySession-바인드된 RMLT를 드라이브할 수 있게 합니다.
- 공유 가능한 LTC를 사용하여 필요한 연결 수를 줄일 수 있습니다.
- 애플리케이션 컴포넌트는 LTC를 공유할 수 있습니다. 컴포넌트가 동일한 자원 관리자에 대한 연결을 얻으면, 동일한 글로벌 트랜잭션이나 공유 가능한 LTC 하에서 실행되는 경우 해당 연결을 공유할 수 있습니다. 두 컴포넌트를 동일한 공유 가능 LTC 하에서 실행하도록 구성하려면, 각 컴포넌트의 배치 디스크립터에서 로컬 트랜잭션 섹션의 Shareable 속성을 설정합니다. 이 요소가 지정된 경우 각 컴포넌트에 대한 배치 디스크립터의 자원 참조는 res-sharing-scope 요소에 대한 Shareable의 기본 값을 사용해야 합니다. 공유 가능한 LTC는 애플리케이션이 사용하는 RMLT의 수를 줄일 수 있습니다. 예를 들어, 웹 모듈 포함 호출을 자주 사용하게 하는 애플리케이션은 이들 웹 모듈 사이의 자원 관리자 연결을 공유하여, 공유 가능한 LTC나 글로벌 트랜잭션을 사용하며, 자원에 대한 잠금 경합을 줄일 수 있습니다.
로컬 트랜잭션 지원 구성의 예
다음 목록은 로컬 트랜잭션을 사용하는 시나리오 및 애플리케이션에 대한 트랜잭션 지원을 구성하는 최선의 방법을 결정할 때 고려할 내용을 제공합니다.
- 애플리케이션에서 명시적으로 글로벌 트랜잭션을 시작하고 종료할 수 있습니다(bean-관리 트랜잭션 세션 bean 및 서블릿 전용).
세션 bean의 경우, 컴포넌트의 배치 디스크립터에서 트랜잭션 유형을 Bean으로 설정합니다(bean-관리 트랜잭션을 사용하도록). 서블릿에 대해서는 이를 수행하지 않아도 됩니다.
메소드에서 하나의 XA 또는 비-XA 자원에만 액세스할 수 있습니다.
로컬 트랜잭션 섹션의 컴포넌트 배치 디스크립터에서 Resolver 속성을 ContainerAtBoundary로 설정합니다. 컨테이너 트랜잭션 섹션에서 컨테이너 트랜잭션 유형을 Supports로 설정합니다.
- 하나 이상의 Bean 메소드에서 여러 XA 자원에 원자적으로 액세스할 수 있습니다.
컨테이너 트랜잭션 섹션의 컴포넌트 배치 디스크립터에서 컨테이너 트랜잭션 유형을 Required, RequiresNew 또는 Mandatory로 설정합니다.
자체 로컬 트랜잭션을 관리하지 않고 메소드에서 여러 비-XA 자원에 액세스할 수 있습니다.
로컬 트랜잭션 섹션의 컴포넌트 배치 디스크립터에서 Resolver 속성을 ContainerAtBoundary로 설정합니다. 컨테이너 트랜잭션 섹션에서 컨테이너 트랜잭션 유형을 NotSupported로 설정합니다.
- 메소드에서 여러 비-XA 자원에 액세스하여 독립적으로 관리할 수 있습니다.
로컬 트랜잭션 섹션의 컴포넌트 배치 디스크립터에서 Resolver 속성을 Application으로 설정하고 Unresolved 조치 속성을 Rollback으로 설정합니다. 컨테이너 트랜잭션 섹션에서 컨테이너 트랜잭션 유형을 NotSupported로 설정합니다.
자체 로컬 트랜잭션을 관리하지 않고 다중 EJB 메소드 호출에서 하나 이상의 비-XA 자원에 액세스할 수 있습니다.
로컬 트랜잭션 섹션의 컴포넌트 배치 디스크립터에서 Resolver 속성을 ContainerAtBoundary로 설정하고 Boundary 속성을 ActivitySession으로 설정합니다. Bean 캐시 섹션에서 Activate 속성을 ActivitySession으로 설정합니다. 컨테이너 트랜잭션 섹션에서 컨테이너 트랜잭션 유형을 NotSupported로 설정하고 ActivitySession 유형 속성을 Required, RequiresNew 또는 Mandatory로 설정합니다.
다중 EJB 메소드 호출에서 여러 비-XA 자원에 액세스하고 독립적으로 관리할 수 있습니다.
로컬 트랜잭션 섹션의 컴포넌트 배치 디스크립터에서 Resolver 속성을 Application으로 설정하고 Boundary 속성을 ActivitySession으로 설정합니다. Bean 캐시 섹션에서 Activate 속성을 ActivitySession으로 설정합니다. 컨테이너 트랜잭션 섹션에서 컨테이너 트랜잭션 유형을 NotSupported로 설정하고 ActivitySession 유형 속성을 Required, RequiresNew 또는 Mandatory로 설정합니다.
복수의 2단계 RRS 자원과 함께 비-XA 자원을 사용할 수 있습니다.
글로벌 트랜잭션이 활성화될 때마다 RRS 자원과 함께 트랜잭션의 비-XA 자원은 지원됩니다. 컨테이너 트랜잭션 유형에 대한 배치 디스크립터가 Supports, Required, RequiresNew 또는 Mandatory로 설정되면 글로벌 트랜잭션이 활성화됩니다. 글로벌 트랜잭션은 컴포넌트 관리 배치에 대해서도 활성화됩니다. 컨테이너는 RRS 자원과 함께 비-XA 자원 로컬 트랜잭션의 완료를 관리합니다.