propagation.nested 并非真正嵌套事务,而是基于 jdbc savepoint 模拟:外层事务中设保存点,内层异常仅回滚至此点,最终提交取决于外层;需数据源支持 savepoint、继承 abstractplatformtransactionmanager 且 isnestedtransactionallowed() 为 true。

Java 中的 Propagation.NESTED 并不是 Spring 自己实现的“真正嵌套事务”,而是基于 JDBC 的 Savepoint(保存点) 机制模拟的。Spring 的 DataSourceTransactionManager 在支持 Savepoint 的数据库连接上,通过 Connection.setSavepoint()、rollbackToSavepoint() 和 releaseSavepoint() 来实现“内层事务失败不影响外层”的效果。
为什么 NESTED 不是真正的嵌套事务?
数据库层面(如 MySQL、PostgreSQL)本身不支持事务嵌套(即一个事务内部开启另一个独立提交/回滚的事务)。NESTED 实际是:
- 在外层事务已开启的前提下,创建一个保存点;
- 内层逻辑执行中若抛出异常,仅回滚到该保存点,外层事务仍可继续;
- 内层“成功”只是释放保存点,不提交——最终是否生效取决于外层事务是否提交。
自定义事务管理器中启用 NESTED 的前提条件
要让自定义事务管理器支持 NESTED,必须满足以下三点:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 底层数据源必须提供支持 Savepoint 的 Connection:例如 HikariCP + MySQL 8.0+、PostgreSQL、Oracle 等。H2、Derby 也支持;但某些老旧驱动或连接池(如早期 DBCP)可能禁用或不兼容。
-
事务管理器需继承
AbstractPlatformTransactionManager或直接复用DataSourceTransactionManager:它已内置 Savepoint 管理逻辑,无需从零写。 -
确保
isNestedTransactionAllowed() == true:默认为true,但若重写了该方法并返回false,NESTED 就会退化为REQUIRED。
关键:Savepoint 的生命周期由 TransactionStatus 控制
Spring 在 doBegin() 阶段(实际是 doSuspend() / doResume() 协同)中,对已有事务的传播行为做区分处理。当检测到当前已有活跃事务且传播级别为 NESTED 时:
- 不新建物理事务,而是调用
con.setSavepoint()创建保存点; - 将该
Savepoint对象封装进DataSourceTransactionObject,再存入TransactionStatus; - 后续若内层事务标记为 rollback-only,
processRollback()会检查是否有保存点,有则调用con.rollback(savepoint); - 若内层正常结束,
triggerBeforeCompletion()会调用con.releaseSavepoint()(非必需,但推荐释放以避免资源累积)。
手动控制 Savepoint 的典型场景(如 AOP 增强中)
如果你在自定义切面或模板方法中需要显式操作 Savepoint(绕过声明式事务),可这样写:
TransactionStatus status = TransactionAspectSupport.currentTransactionStatus();
if (status.hasSavepoint()) {
// 已在 NESTED 内,可安全使用
} else if (status.isNewTransaction()) {
// 外层新事务,可手动设点
status.createSavepoint(); // 底层调用 con.setSavepoint()
}
// ...业务逻辑...
if (needRollbackInner) {
status.rollbackToSavepoint(); // 回滚到最近 savepoint
}
// 最后记得 release(Spring 通常自动做)
status.releaseSavepoint();
注意:TransactionStatus 必须来自当前线程绑定的事务(即 TransactionSynchronizationManager),否则会报错或无效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










