5

假设我有一个实现 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 调用?)

4

2 回答 2

5

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

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

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

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

于 2012-11-10T16:16:32.210 回答
0

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

如果您想要这种语义,您将需要使用软件事务内存产品。

于 2012-11-10T15:44:34.400 回答