根据 JTA 标准,应该从事务方法中抛出哪个异常?

Which exception should be thrown from a transactional method according to JTA standard?

假设我们开发了一些自定义 JTA 实现。

考虑以下方法:

@Transactional
public void foo() {
   em.save(...); // some interaction with EntityManager
   throw new IllegalStateException("Foo");
}

假设 em.save(...) 工作正常,没有抛出异常。所以我们总是以 throw new IllegalStateException("Foo") 结束。很明显,这种情况下应该回滚事务。

问题是:在运行时,根据 JTA 标准,foo() 方法的调用应该抛出 RollbackException 还是原始的 IllegalStateException

换句话说:

try {
   foo();
} catch (Exception e) {
   // What type of exception we should expect here?
}

我个人的观点是应该预料到原来的异常(IllegalStateException("Foo")在这种情况下)。但是,我希望收到一些严格基于 JTA 文档或其他常规合同的答复。

RollbackException (https://docs.oracle.com/javaee/7/api/javax/persistence/RollbackException.html) 的文档提到:

Thrown by the persistence provider when EntityTransaction.commit() fails.

在你的情况下,EntityTransaction.commit() 不应该被调用,所以这个异常不会被抛出。