Spring 和 Hibernate 中的嵌套事务

Nested transactions in Spring and Hibernate

我有一个 Spring 使用 Hibernate/JPA 持久启动的应用程序。

我正在使用事务来管理我的数据库持久性,并且我正在使用 @Transactional 注释来定义应该以事务方式执行的方法。

我在持久化时有三个主要级别的事务粒度:

  1. 要持久化的实体批次
  2. 要持久化的单个实体
  3. 持久化实体的单一数据库操作

因此,在考虑整个持久性通量时,您可以想象我有三层嵌套事务。

2 级和 3 级之间的交互按照我的意愿透明地工作,因为没有指定任何 Propagation behaviour for the transaction, the default is the REQUIRED 行为,因此整个实体(2 级)被回滚,因为 3 级将支持中定义的事务2 级。

但是,问题是我需要 1 和 2 之间的交互略有不同。如果发生错误,我需要单独回滚一个实体,但我不希望回滚整个批次。也就是说,我需要在符合这些要求的 2 级注释 @Transactional(propagation = X) 中指定传播行为。

我试过 REQUIRES_NEW 但这不起作用,因为即使必须回滚整个批次,它也会提交 2 级的一些实体,这也可能发生。

似乎更符合描述的行为是NESTED, but that is not accepted when using Spring and Hibernate JPA, see here以获取更多信息。

最后一个 link 提供了 NESTED 类型的替代方案,但我想知道 NESTED 是否真的能解决我的问题,或者是否有其他行为更适合这项工作。

我猜 NESTED 大致可以做你想做的事,但我怀疑这是否真的有必要。我不知道你想做什么或错误情况是什么,但也许你可以通过使用某种 WHERE 子句或 UPSERT 语句来摆脱错误情况: