根据 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()
不应该被调用,所以这个异常不会被抛出。
假设我们开发了一些自定义 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()
不应该被调用,所以这个异常不会被抛出。