【发布时间】:2016-02-05 07:41:56
【问题描述】:
我的 Spring/Java Web 应用程序有@Transactional 可以接触数据库的服务:
@Transactional
public class AbstractDBService { ... }
所需的功能适用于任何 未捕获 可抛出,它向上传播到服务层之外以导致回滚。有点惊讶这不是默认行为,但经过一番谷歌搜索后:
@Transactional(rollbackFor = Exception.class)
这似乎有效,除非故意吞下异常而不重新抛出异常。 (特殊情况是找不到实体。猜想这可以重新设计为不抛出异常,但预计会不可避免地出现其他异常 - 例如,在使用 Thread.sleep() 时会想到一个 InterruptedException) . 然后 Spring 抱怨:
org.springframework.transaction.TransactionSystemException:无法提交 JPA 事务;嵌套异常是 javax.persistence.RollbackException:事务标记为 仅回滚 ...被截断了.. 引起:javax.persistence.RollbackException:事务标记为rollbackOnly 在 org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:58) 在 org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
我在这里遗漏了什么吗?...有没有办法告诉 Spring 回滚所有未捕获的 throwables?
【问题讨论】:
-
我很困惑。您当前的
rollbackFor应该会导致@Transactional代理回滚从注释方法中抛出的任何Exception。这不是你看到的吗? -
我看到了,但它也似乎在这样的
Exception被捕获而不是重新抛出时进行了失败的回滚尝试。 (This answer 似乎支持这一点。)
标签: java spring hibernate jpa transactions