是否可以通过不同的EJB 3.1和多个数据库服务器传播事务?

时间:2015-04-01 17:45:22

标签: java transactions ejb

问题是这样,我有三个EJB,EJB_A连接到服务器数据库1,EJB_B连接到服务器数据库2,第三个EJB_C负责调用前两个。

当EJB_A或EJB_B中存在错误时,只有在存在错误的EJB中完成回滚,在正确完成保存的其他EJB上,尽管它应该将回滚传播到两个EJB。

EJB_C:

@Stateless
@LocalBean
@TransactionManagement( TransactionManagementType.BEAN )
public class EJB_C {

    private EJB_A ejbA;
    private EJB_B ejbB;

    @PostConstruct
    public void init(){
        Context context = null;
        try {
            context = new InitialContext();
            this.ayudanteSessionBean = (AyudanteSessionBean) context.lookup("java:global/Trans1/Trans1DBA/EJB_A");
            this.ayudanteSessionBean = (AyudanteSessionBean) context.lookup("java:global/Trans1/Trans1DBA/EJB_B");
        } catch (NamingException ex) {
            Logger.getLogger(OrquestadorSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void saveTwoEJBs(EntityA, a, EntityB b){
        try{
            ejbA.save(a);
            ejbB.save(b);
        }catch (Exception ex) {

        }
    }
}

EJB_A:

@Stateless
@LocalBean
public class EJB_A {
    @PersistenceContext( unitName = "persistA" )
    private EntityManager em;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void guardarAmigo(EntityA a){
        em.persist(a);
    }
}

EJB_B:

@Stateless
@LocalBean
public class EJB_B {
    @PersistenceContext( unitName = "persistB" )
    private EntityManager em;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void guardarAmigo(EntityB b){
        em.persist(b);
    }
}

你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

嗯,要使其正常工作,您需要正确设置分布式事务(XA):

  1. 检查所有数据源是否已准备好XA。通常,这意味着在安装过程中不同的jdbc驱动程序类名称和不同类型的连接池。 该过程由供应商指定,但始终在应用程序服务器的文档中进行了描述。
  2. 您需要删除注释:

    @TransactionManagement(TransactionManagementType.BEAN)

  3. 让你的容器(实际上是他的事务代理)来管理事务而不是bean。 3.您需要在方法saveTwoEJBs上添加@TransactionAttribute注释:

     @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void saveTwoEJBs(EntityA, a, EntityB b)
    
    1. 这不是必需的,但没有理由通过JNDI上下文查找EJB bean,只需通过@EJB注释注入它们:

      @EJB
      private EJB_A ejbA;
      @EJB
      private EJB_B ejbB;
      
    2. 要去的一些链接:

      http://docs.oracle.com/cd/E13222_01/wls/docs100/ejb30/examples.html http://docs.oracle.com/cd/E16439_01/doc.1013/e13981/servtran001.htm http://entjavastuff.blogspot.ru/2011/02/ejb-transaction-management-going-deeper.html