如何在单个Hibernate Session中通过@Transactional执行两个Spring事务?
如何用@Transactional实现Hibernate同Session下的嵌套事务
你完全不需要依赖底层Session操作或者自定义事务管理就能实现这个需求——Spring的@Transactional注解通过事务传播行为就能帮你在同一个Hibernate Session里创建嵌套事务,核心就是用Propagation.NESTED这个属性。
核心原理
Propagation.NESTED的作用是:如果当前已经存在一个事务,那么这个方法会在当前事务内部创建一个基于Savepoint的嵌套事务,它和外层事务共用同一个Hibernate Session。嵌套事务的回滚只会影响自身范围内的操作,不会直接导致外层事务回滚(除非你主动让外层也回滚);如果嵌套事务执行成功,最终会和外层事务一起提交。
前提条件
- 你的数据库要支持Savepoint(比如MySQL InnoDB、PostgreSQL、Oracle等,MyISAM不支持);
- 使用支持嵌套事务的Spring事务管理器,比如
HibernateTransactionManager或者JpaTransactionManager; - 外层方法必须已经开启了事务(即带有
@Transactional注解),否则NESTED会退化成REQUIRED的行为,开启新事务。
完整代码示例
补全你给出的代码框架,实现嵌套事务:
@Service public class DoubleTransaction { @Autowired private SessionFactory sessionFactory; @Autowired private NestedTxHandler nestedTxHandler; // 外层事务,默认使用Propagation.REQUIRED,会开启一个Hibernate Session和事务 @Transactional public void executeDoubleTransaction() { // 外层事务的业务操作:比如保存一个用户 User outerUser = new User(); outerUser.setUsername("外层事务用户"); sessionFactory.getCurrentSession().persist(outerUser); // 调用嵌套事务方法 try { nestedTxHandler.executeNestedTransaction(); } catch (RuntimeException e) { // 捕获嵌套事务的异常,仅回滚嵌套部分,外层事务可以继续执行 System.err.println("嵌套事务执行失败,已回滚嵌套操作:" + e.getMessage()); } // 外层事务最终会提交(包括外层的操作,以及嵌套事务未回滚的操作) } } @Service public class NestedTxHandler { @Autowired private SessionFactory sessionFactory; // 嵌套事务:使用Propagation.NESTED,共用外层的Hibernate Session @Transactional(propagation = Propagation.NESTED) public void executeNestedTransaction() { // 嵌套事务的业务操作:比如保存一个订单 Order nestedOrder = new Order(); nestedOrder.setOrderDesc("嵌套事务订单"); sessionFactory.getCurrentSession().persist(nestedOrder); // 模拟异常,测试嵌套事务回滚 // throw new RuntimeException("嵌套事务触发异常"); } }
关键细节说明
- 事务传播行为的区别:别把
NESTED和REQUIRES_NEW搞混——REQUIRES_NEW会开启一个全新的事务,使用独立的Hibernate Session;而NESTED是在同一个Session里的嵌套,基于数据库的Savepoint实现。 - AOP代理的限制:嵌套事务方法必须放在单独的类里,因为Spring的事务是基于动态代理实现的,同一个类内部的方法调用不会触发事务代理,导致
@Transactional注解失效。 - 回滚控制:如果嵌套事务抛出异常且被外层捕获,只会回滚嵌套部分的操作;如果外层事务也抛出异常,那么整个事务(包括外层和嵌套部分)都会被回滚。
内容的提问来源于stack exchange,提问作者uptoyou
相关产品推荐
相关产品推荐

