EJB事务调用POJO

时间:2012-11-10 15:18:18

标签: java-ee transactions

假设我有一个实现REQUIRED事务方法的会话bean:

@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调用?)

2 个答案:

答案 0 :(得分:5)

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

有几种方法可以加入这样的交易。最完整的方法是实现XAResource接口并让代码登记该实现。一种更简单但功能更弱的方法是使用Synchronizer

严格地说,EJB容器或事务管理器本身都不回滚任何东西。相反,它为登记的资源提供了进行此类回滚的机会。因此,它本身永远不会恢复在事务期间碰巧被修改的随机变量的先前值。

为了完整性, 通常(自动)登记在事务中的资源是数据库连接(如果它们来自容器管理的数据源),JMS消息(同样,如果目标是容器管理的话) ),(分布式)缓存和基于JCA的EIS资源。

答案 1 :(得分:0)

JavaEE不会回滚非bean 更改。它将回滚的唯一内容是实体,但只有在从DB中再次读取它们之后。

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