Spring 和 Hibernate 中的嵌套事务
Nested transactions in Spring and Hibernate
我有一个 Spring 使用 Hibernate/JPA 持久启动的应用程序。
我正在使用事务来管理我的数据库持久性,并且我正在使用 @Transactional
注释来定义应该以事务方式执行的方法。
我在持久化时有三个主要级别的事务粒度:
- 要持久化的实体批次
- 要持久化的单个实体
- 持久化实体的单一数据库操作
因此,在考虑整个持久性通量时,您可以想象我有三层嵌套事务。
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 语句来摆脱错误情况:
我有一个 Spring 使用 Hibernate/JPA 持久启动的应用程序。
我正在使用事务来管理我的数据库持久性,并且我正在使用 @Transactional
注释来定义应该以事务方式执行的方法。
我在持久化时有三个主要级别的事务粒度:
- 要持久化的实体批次
- 要持久化的单个实体
- 持久化实体的单一数据库操作
因此,在考虑整个持久性通量时,您可以想象我有三层嵌套事务。
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 语句来摆脱错误情况: