Java 根据JTA标准,应该从事务性方法引发哪个异常?
假设我们开发了一些定制的JTA实现 考虑以下方法:Java 根据JTA标准,应该从事务性方法引发哪个异常?,java,exception,rollback,jta,Java,Exception,Rollback,Jta,假设我们开发了一些定制的JTA实现 考虑以下方法: @Transactional public void foo() { em.save(...); // some interaction with EntityManager throw new IllegalStateException("Foo"); } 让我们假设em.save(…)工作正常,不会引发异常。所以我们总是以抛出新的非法状态异常(“Foo”)而告终。很明显,在这种情况下应该回滚事务 问题是:根据JTA标准,在运行
@Transactional
public void foo() {
em.save(...); // some interaction with EntityManager
throw new IllegalStateException("Foo");
}
让我们假设em.save(…)
工作正常,不会引发异常。所以我们总是以抛出新的非法状态异常(“Foo”)而告终。很明显,在这种情况下应该回滚事务
问题是:根据JTA标准,在运行时,调用foo()
方法是否会引发RollbackException
或原始IllegalStateException
换言之:
try {
foo();
} catch (Exception e) {
// What type of exception we should expect here?
}
我个人的观点是,最初的异常(
IllegalStateException(“Foo”)
,在本例中)应该是预期的。然而,我希望得到一些严格基于JTA文档或其他常规合同的答案。回滚异常的文档提到:
EntityTransaction.commit()失败时由持久性提供程序引发
在您的情况下,EntityTransaction.commit()
不应被调用,因此不应引发此异常