Java 根据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标准,在运行

假设我们开发了一些定制的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()
不应被调用,因此不应引发此异常