2012-11-10 32 views
5

EJB事务假设我有一个实现所需的交易方法的会话bean:与调用POJO

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public void doTransaction() throws Exception { 
    try { 
     ... 
     // call to non-EJB bean object (not session, stateless or entity bean) 
    } catch (Exception e) { 
     context.setRollbackOnly(); 
     throw e; 
    } 
} 

假设doTransaction()改变非bean对象的内部状态,和失败。回滚是否恢复了非bean的原始状态? 如果不是,那么推荐的方法是什么来处理这种情况? (或者POJO内部的交易是不允许的?)

+0

你可以举一个这个pojo的例子,它是一个静态类变量吗?我有这样的感觉,你正试图做一些可以做得不同的事情 –

回答

5

EJB自动完成的回滚抛出异常,只会影响已加入正在进行的(JTA)事务的资源。

有几种方法可以加入这种交易。最完整的方法是通过实现XAResource接口并让您的代码征用该实现。更简单但不太有效的方法是使用Synchronizer

严格地说,EJB容器或事务管理器本身都不会回滚任何东西。相反,它为入伍的资源提供了这样一个回滚的机会。因此,它本身永远不会能够恢复事务期间恰好被修改的随机变量的先前值。数据库连接(如果它们来自容器管理的数据源),JMS消息(同样,如果目的地是容器管理的),(分布式的),(分布式的) )缓存和基于JCA的EIS资源。

0

JavaEE不会回滚非豆的更改。它将回滚的唯一东西是实体,但是只有在从数据库中再次读取它们之后。

如果您想要这种语义,您需要使用Software Transactional Memory产品。