【发布时间】:2015-01-15 16:22:56
【问题描述】:
以下是 EJB 类 1 的源代码:
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EJB1 {
public void method1(Callback callback) {
callback.createObject();
Entity1 entity = new Entity1();
try {
entityManager.persist(entity1);
entityManager.flush()
} catch(Exception e) {
//do something
}
}
}
回调类是一个没有 TransactionalContext 的 POJO,它调用 EJB 2 的另一个方法(通过 JNDI 查找),再次具有 TransactionAttribute.REQUIRED:
public class Callback {
public void createObject() {
getEJB2().createObject();
}
public EJB2 getEJB() {
//lookup EJB2 via JNDI
}
}
EJB2源代码:
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EJB2 {
public void createObject() {
Entity2 entity = new Entity2();
entityManager.persist(entity);
entityManager.flush()
}
}
如果在 EJB1 中持久化 entity1 失败(例如,由于数据库中的 UniqueConstraint),则 EJB1 的事务成功标记为回滚。例如,当尝试在 EJB1 的 try-catch 中删除创建的对象时不起作用(因为事务已标记为回滚)。
虽然在 EJB2 中创建和持久化的对象仍然存在并且没有回滚! 设置 - 用于实验性用途 - EJB2 事务上下文强制创建仍然可以正常工作(表明 EJB2 不会创建新事务,而是通过 REQUIRED 参与现有事务)。
但是为什么EJB2中新创建的对象没有回滚呢?
【问题讨论】:
标签: rollback pojo transactional propagation