假设我有一个实现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调用?)
答案 0 :(得分:5)
EJB自动执行的回滚,例如抛出异常,只会影响已加入正在进行的(JTA)事务的资源。
有几种方法可以加入这样的交易。最完整的方法是实现XAResource接口并让代码登记该实现。一种更简单但功能更弱的方法是使用Synchronizer。
严格地说,EJB容器或事务管理器本身都不回滚任何东西。相反,它为登记的资源提供了进行此类回滚的机会。因此,它本身永远不会恢复在事务期间碰巧被修改的随机变量的先前值。
为了完整性, 通常(自动)登记在事务中的资源是数据库连接(如果它们来自容器管理的数据源),JMS消息(同样,如果目标是容器管理的话) ),(分布式)缓存和基于JCA的EIS资源。
答案 1 :(得分:0)
JavaEE不会回滚非bean 更改。它将回滚的唯一内容是实体,但只有在从DB中再次读取它们之后。
如果您需要这种语义,则需要使用Software Transactional Memory产品。