2013-08-04 7 views
3

잠시 동안 Java EE 플랫폼을 사용하여 프로그래밍했지만 가끔 더 큰 그림을 놓치고 있습니다.하나의 JTA 트랜잭션에서 여러 XA 데이터 소스

EJB 및 Container-Managed Transactions을 사용하면 단일 트랜잭션에서 여러 데이터 소스에 대한 작업을 어떻게 수행 할 수 있습니까?

내 코드는 다음과 같습니다

AAA-EJB 모듈

가 첫 번째 데이터 소스에 persistence.xml 포인팅을 포함합니다.

@Stateless 
public class AaaDao { 
    @PersistenceContext 
    EntityManager em; 

    // using defaults: @TransactionAttribute(REQUIRED) 
    public void foo(...) { 
     em.persist(...); 
    } 
} 

BBB-EJB 모듈

는 제 2 데이터 소스를 가리키는 다른 persistence.xml (다른 퍼시스턴스 유닛)을 포함한다.

@Stateless 
public class BbbDao { 
    @PersistenceContext 
    EntityManager em; 

    // using defaults: @TransactionAttribute(REQUIRED) 
    public void bar(...) { 
     em.persist(...); 
    } 
} 

CCC-EJB 모듈

는 상기 두 개의 모듈에 의존한다.

@Stateless 
public class CccBean { 
    @EJB AaaDao aaaDao; 
    @EJB BbbDao bbbDao; 

    // using defaults: @TransactionAttribute(REQUIRED) 
    public void qux(...) { 
     aaaDao.foo(...); 
     bbbDao.bar(...); 
    } 
} 

내 말은 : 정말 쉽지 않은가요? 나는 상황이 "마술처럼"작동하는 것처럼 보일 때마다 항상 회의적입니다. 나는 항상 "잡기"가 있다고 의심합니다.

Java EE 5, EJB 3.0, Oracle WebLogic 10.3의 JPA 1.0을 사용하십시오.

답변

1

네, 정말 쉽습니다. CccBean.qux은 새로운 XA 트랜잭션을 시작하고 AaaDao/BbbDao의 호출자는 동일한 트랜잭션을 다시 사용합니다 (사용자가 지적한대로 REQUIRED이므로). EntityManagerDataSource이고, DataSource은 이고, 거래는 XAResource입니다. C ccBean.qux이 종료되면 트랜잭션이 커밋되고 트랜잭션 관리자는 DataSource의 등록 된 XAResource에서 2 단계 커밋을 수행합니다.