【发布时间】:2012-03-06 15:07:43
【问题描述】:
请帮助我了解有关 EJB 3.1 中事务的一些信息。我正在使用 GlassFish v3 并且有以下情况:
@Stateless
@LocalBean
public class BeanA {
@Inject BeanB bean; /* which has no TransactionAttribute set */
@Resource SessionContext context;
public void run() {
...
for (...) {
process(someValue);
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void process(String someValue) {
try {
SomeEntity entity = bean.getEntity(someValue);
entity.setSomeProperty("anotherValue");
...
} catch(CustomException e) {
this.context.setRollbackOnly();
}
}
}
BeanA.run 是从 servlet 调用的。我想将每次迭代视为单独的事务。我认为使用 TransactionAttributeType.REQUIRES_NEW 会实现这一点,但是在调用 setRollbackOnly 之后,我在 beanB 的后续迭代中得到了 javax.ejb.EJBTransactionRolledbackException。奇怪的是,当我将除 run() 之外的所有内容移动到新的 BeanC 并调用 beanC.process 时,它确实可以工作。我错过了什么?任何人都可以解释一下为什么会这样吗?
编辑:想一想:是不是因为容器没有拦截对同一个 EJB 中方法的调用? (这似乎是合理的)
编辑 2:是的,在这里找到了答案:EJB Transactions in local method-calls(我必须知道答案才能找到它:))
【问题讨论】:
-
请为您的问题提供答案并将其标记为已解决,以便正确标记问题。此外,以下资源可能对您有用:stackoverflow.com/questions/8079142/…piotrnowicki.com/2011/11/…stackoverflow.com/a/7218283/920607
-
感谢您的意见。我还得再等 7 个小时才能回答我自己的问题。
标签: transactions glassfish ejb