2013-08-04 6 views
3

Я некоторое время программировал платформу Java EE, но иногда мне не хватает большего изображения.Несколько источников данных XA в одной транзакции JTA

Использование EJB и Container-Managed Transactions, как я могу выполнять операции с несколькими источниками данных в одной транзакции?

Мой код выглядит следующим образом:

ааа-модуль EJB

Содержит persistence.xml, указывающий на первый источник данных.

@Stateless 
public class AaaDao { 
    @PersistenceContext 
    EntityManager em; 

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

модуль БББ-EJB

Содержит другой persistence.xml (другой блок сохранения), указывающий на второй источник данных.

@Stateless 
public class BbbDao { 
    @PersistenceContext 
    EntityManager em; 

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

модуль ссс-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, JPA 1.0 для Oracle WebLogic 10.3.

ответ

1

Да, это действительно так просто. CccBean.qux начинает новую транзакцию XA, вызывающие к AaaDao/BbbDao повторно используют ту же транзакцию (из-за REQUIRED как вы указываете). EntityManager использование DataSource и DataSource будет enlistResource a XAResource с транзакцией. Когда C ccBean.qux выйдет, транзакция будет совершена, и менеджер транзакций будет вести двухфазную фиксацию как на XAResource, зарегистрированном в DataSource.