【问题标题】:EJB Transaction with call to POJO调用 POJO 的 EJB 事务
【发布时间】:2012-11-10 15:18:17
【问题描述】:

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

【问题讨论】:

  • 你能举一个这个pojo的例子吗,它是一个静态类变量吗?我有一种感觉,您正在尝试做一些可以以不同方式完成的事情

标签: jakarta-ee transactions


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      相关资源
      最近更新 更多