
示例工程文档【免费下载链接】spring-reading涵盖了 Spring 框架的核心概念和关键功能包括控制反转IOC容器的使用面向切面编程AOP的原理与实践事务管理的方式与实现Spring MVC 的流程与控制器工作机制以及 Spring 中数据访问、安全、Boot 自动配置等方面的深入研究。此外它还包含了 Spring 事件机制的应用、高级主题如缓存抽象和响应式编程以及对 Spring 源码的编程风格与设计模式的深入探讨。项目地址https://gitcode.com/GitHub_Trending/sp/spring-reading点击查看免费下载PlatformTransactionManager是 Spring 事务抽象体系中负责管理事务的核心策略接口为 JDBC、JTA、Hibernate 等不同数据访问技术提供了统一的事务管理入口。本文基于 spring-reading 仓库中 spring-transaction-platformTransactionManager 模块 的文档与源码系统讲解该接口的四大核心方法、事务传播行为与隔离级别等关键参数、典型编程式事务实战以及从getTransaction到commit/rollback的完整底层调用链帮助读者真正吃透 Spring 命令式事务的运作机制。一、PlatformTransactionManager 是什么PlatformTransactionManager接口是 Spring 框架中负责管理事务的核心接口它定义了统一的事务管理方法包括事务的启动、提交、回滚和获取当前事务状态等。通过这一抽象层应用程序可以面向统一的事务 API 编程而无需关心底层具体使用的是 JDBC 连接、JTA 全局事务还是 Hibernate 会话从而便于在不同数据访问技术之间无缝切换。它继承自org.springframework.transaction.TransactionManagerSpring 5 中引入的标记接口同时派生了面向响应式编程的ReactiveTransactionManager其核心定位是Spring 命令式事务基础架构的中心接口。正如接口源码注释所述应用可以直接使用它但更常见的用法是通过TransactionTemplate或基于 AOP 的声明式事务TransactionInterceptor来界定事务边界。二、四大核心功能1. 开始事务getTransactionPlatformTransactionManager允许我们通过getTransaction(TransactionDefinition definition)方法开始一个新的事务或获取一个已存在的事务。TransactionDefinition对象定义了事务的属性如传播行为、隔离级别、超时设置和只读标志等。TransactionStatus getTransaction(Nullable TransactionDefinition definition) throws TransactionException;2. 提交事务commit如果事务中的所有操作都成功完成可以通过commit(TransactionStatus status)方法提交事务使事务中的所有更改永久化。void commit(TransactionStatus status) throws TransactionException;3. 回滚事务rollback如果在事务中发生任何异常或错误可以通过rollback(TransactionStatus status)方法回滚事务撤销事务中的所有更改使数据库回到事务开始前的状态。void rollback(TransactionStatus status) throws TransactionException;4. 获取事务状态TransactionStatusTransactionStatus对象提供了关于当前事务状态的信息如是否是新事务、是否已完成、是否已回滚、是否设置了 rollback-only 等。这些信息可以用于在事务处理过程中进行条件逻辑判断是连接“事务管理器”与“业务代码”的状态载体。三、接口源码逐方法解读仓库文档完整收录了PlatformTransactionManager接口源码可在 README 中查看下面提炼每个方法的契约要点getTransaction 的语义约定根据指定的传播行为返回当前活动事务或创建一个新事务隔离级别、超时等参数仅在创建新事务时生效参与已存在事务时会被忽略并非所有事务定义设置都被所有事务管理器支持遇到不支持的设置时实现应抛出异常唯一例外是只读标志若不支持显式只读模式应忽略它只读本质上只是对底层优化的一个提示可能抛出TransactionException查找、创建或系统错误与IllegalTransactionStateException事务定义与当前状态冲突例如 mandatory 传播下无现存事务。commit 的语义约定根据事务状态提交给定事务若事务已被程序标记为仅回滚rollback-only则执行回滚若事务不是新事务则省略提交以正确参与周围的事务若先前事务被挂起提交新事务后恢复先前事务提交调用完成无论正常还是抛异常时事务必须完全完成和清理此时不应再期望回滚调用可能抛出UnexpectedRollbackException协调器启动意外回滚、HeuristicCompletionException启发式决策失败、TransactionSystemException系统错误、IllegalTransactionStateException事务已完成。rollback 的语义约定若事务不是新事务则仅将其标记为回滚以正确参与周围事务若先前事务被挂起回滚新事务后恢复先前事务重要约定若 commit 抛出异常不要调用 rollback——当 commit 返回时事务已完成清理提交失败后调用 rollback 将导致IllegalTransactionStateException。四、事务定义 TransactionDefinition决定事务行为的参数表getTransaction的参数TransactionDefinition是控制事务行为的核心配置载体在仓库的 spring-transaction-transactionDefinition 模块 中有完整源码。它定义了四类属性传播行为、隔离级别、超时时间、只读标志。1. 传播行为Propagation Behavior常量值语义PROPAGATION_REQUIRED0支持当前事务不存在则新建默认值通常定义事务同步范围PROPAGATION_SUPPORTS1支持当前事务不存在则以非事务方式执行PROPAGATION_MANDATORY2支持当前事务不存在则抛出异常PROPAGATION_REQUIRES_NEW3新建事务存在则挂起当前事务PROPAGATION_NOT_SUPPORTED4不支持事务总是以非事务方式执行存在则挂起PROPAGATION_NEVER5不支持事务存在则抛出异常PROPAGATION_NESTED6存在当前事务时执行嵌套事务否则行为同 REQUIRED接口默认返回PROPAGATION_REQUIRED。注意REQUIRES_NEW与NOT_SUPPORTED的事务挂起并非在所有事务管理器上都自动生效尤其依赖JtaTransactionManager提供javax.transaction.TransactionManagerNESTED默认仅适用于基于 JDBC 3.0 驱动程序的DataSourceTransactionManager通过保存点实现。2. 隔离级别Isolation Level常量值解决/允许的并发问题ISOLATION_DEFAULT-1使用底层数据存储的默认隔离级别ISOLATION_READ_UNCOMMITTED1允许脏读、不可重复读和幻读ISOLATION_READ_COMMITTED2防止脏读可能发生不可重复读和幻读ISOLATION_REPEATABLE_READ4防止脏读和不可重复读可能发生幻读ISOLATION_SERIALIZABLE8防止脏读、不可重复读和幻读这些常量与java.sql.Connection上的对应常量取值一致。隔离级别与超时设置仅对新启动的事务REQUIRED / REQUIRES_NEW / NESTED生效若希望在参与隔离级别不同的现存事务时拒绝声明可将事务管理器的validateExistingTransactions标志置为true。3. 超时时间Timeout默认TIMEOUT_DEFAULT -1表示使用底层事务系统的默认超时不支持超时则为无。指定超时时单位为秒仅在新建事务时应用不支持超时的事务管理器在给定非默认值时抛出异常。4. 只读标志ReadOnly默认false。只读标志适用于任何事务上下文无论是实际资源事务支持还是在资源级别非事务性操作如PROPAGATION_SUPPORTS。它只是对实际事务子系统的优化提示不一定会导致写访问尝试失败不理解该提示的事务管理器在要求只读事务时不会抛出异常。五、主要实现与类关系图PlatformTransactionManager的策略接口默认实现是JtaTransactionManager与DataSourceTransactionManager可作为其他事务策略的实现指南。仓库文档重点介绍了DataSourceTransactionManager即基于 JDBC 的事务管理器。此外官方注释明确建议实现者应从org.springframework.transaction.support.AbstractPlatformTransactionManager抽象类派生该类预先实现了传播行为处理与事务同步处理子类只需实现begin、suspend、resume、commit等底层模板方法。完整类关系如下来源READMEclassDiagram direction BT class AbstractPlatformTransactionManager class DataSourceTransactionManager class InitializingBean { Interface } class PlatformTransactionManager { Interface } class ResourceTransactionManager { Interface } class TransactionManager { Interface } AbstractPlatformTransactionManager .. PlatformTransactionManager DataSourceTransactionManager -- AbstractPlatformTransactionManager DataSourceTransactionManager .. InitializingBean DataSourceTransactionManager .. ResourceTransactionManager PlatformTransactionManager -- TransactionManager ResourceTransactionManager -- PlatformTransactionManager其中ResourceTransactionManager扩展自PlatformTransactionManager额外提供getResourceFactory()以暴露底层资源工厂DataSourceDataSourceTransactionManager同时实现了InitializingBean可在容器中完成初始化校验。六、最佳实践基于 JDBC 的编程式事务实战仓库文档给出了一个完整的编程式事务示例对应的可直接运行源码位于 PlatformTransactionManagerDemo.java。核心思路配置数据源与DataSourceTransactionManager借助JdbcTemplate执行 SQL手动开启、提交、回滚事务。1. 准备建表 SQL示例向scores表插入随机分数并在完整版 Demo 中向scores_log表记录日志两张表的建表语句见 spring-transaction/sql/test.sqlCREATE TABLE scores ( id bigint NOT NULL, score decimal(5, 2) NULL DEFAULT NULL, PRIMARY KEY (id) USING BTREE ) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ROW_FORMAT DYNAMIC; CREATE TABLE scores_log ( id bigint NOT NULL, score_id bigint NULL DEFAULT NULL, create_time datetime NULL DEFAULT NULL, PRIMARY KEY (id) USING BTREE ) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ROW_FORMAT DYNAMIC;2. 完整示例代码public class PlatformTransactionManagerDemo { private static PlatformTransactionManager transactionManager; private static JdbcTemplate jdbcTemplate; public static void main(String[] args) throws SQLException { // 数据库连接 URL格式为 jdbc:数据库驱动名称://主机地址:端口号/数据库名称 String url jdbc:mysql://localhost:3306/spring-reading; // 数据库用户名 String username root; // 数据库密码 String password 123456; // 创建 SimpleDriverDataSource 对象用于管理数据源 SimpleDriverDataSource dataSource new SimpleDriverDataSource(new Driver(), url, username, password); // 创建 DataSourceTransactionManager 对象用于管理事务 transactionManager new DataSourceTransactionManager(dataSource); // 创建 JdbcTemplate 对象用于执行 SQL 语句 jdbcTemplate new JdbcTemplate(dataSource); insertScore(); } private static void insertScore() { // 开启一个新的事务返回事务状态对象默认传播行为 PROPAGATION_REQUIRED TransactionStatus transactionStatus transactionManager.getTransaction(new DefaultTransactionDefinition()); try { long id System.currentTimeMillis(); int score new Random().nextInt(100); // 向数据库中插入随机生成的分数 int row jdbcTemplate.update(insert into scores(id,score) values(?,?), id, score); // 模拟异常用于测试事务回滚 // int i 1 / 0; // 提交事务 transactionManager.commit(transactionStatus); // 打印影响行数 System.out.println(scores row row); } catch (Exception e) { // 出现异常时回滚事务 transactionManager.rollback(transactionStatus); e.printStackTrace(); } } }3. 运行要点说明依赖版本仓库根 pom.xml 声明 Spring Framework5.2.15.RELEASE、MySQL 驱动8.0.30、Java 11模块自身的 pom.xml 继承自spring-transaction聚合模块后者统一引入了mysql-connector-java依赖。传播行为定制Demo 源码中实际使用new DefaultTransactionDefinition(DefaultTransactionDefinition.PROPAGATION_REQUIRED)显式指定传播行为更完整的版本还包含insertScoreLog方法演示多段代码共享同一事务管理器。回滚验证将// int i 1 / 0;取消注释即可模拟运行时异常观察scores表中不会留下本次插入的数据验证事务回滚效果。编程式 vs 声明式该示例展示的是最底层的编程式事务用法实际生产环境更推荐通过TransactionTemplate或Transactional底层由TransactionInterceptor配合 AOP 实现来简化事务边界管理。七、源码级原理分析本模块文档沿着“开启事务 → 提交事务 → 回滚事务”三条主线逐层剖析了从PlatformTransactionManager接口到DataSourceTransactionManager具体实现的完整调用链下面梳理其核心脉络。1. 开启事务的调用链1入口AbstractPlatformTransactionManager#getTransaction该模板方法处理传播行为委托给doGetTransaction、isExistingTransaction和doBegin。核心逻辑未传入定义时使用TransactionDefinition.withDefaults()兜底调用doGetTransaction()获取底层事务对象通过isExistingTransaction(transaction)判断是否存在活动事务存在则转交handleExistingTransaction新建事务前校验超时def.getTimeout() TIMEOUT_DEFAULT时抛出InvalidTimeoutException传播行为为PROPAGATION_MANDATORY但无现存事务时抛出IllegalTransactionStateException传播行为为 REQUIRED / REQUIRES_NEW / NESTED 时先suspend(null)挂起可能存在的资源再通过startTransaction创建新事务启动失败则resume(null, suspendedResources)恢复并抛出异常其他传播行为SUPPORTS 等则返回“空事务”状态——没有实际事务但可能存在同步若此时指定了自定义隔离级别仅输出 warn 日志。2获取事务对象DataSourceTransactionManager#doGetTransaction创建DataSourceTransactionObject事务对象设置保存点允许状态由isNestedTransactionAllowed()决定并通过TransactionSynchronizationManager.getResource(dataSource)获取当前线程绑定的连接持有者ConnectionHolder设置到事务对象后返回。3判断现存事务DataSourceTransactionManager#isExistingTransaction将事务对象强转为DataSourceTransactionObject判断其hasConnectionHolder()且getConnectionHolder().isTransactionActive()即连接持有者中的事务是否处于活动状态。4处理现存事务AbstractPlatformTransactionManager#handleExistingTransaction按传播行为分支处理PROPAGATION_NEVER存在事务即抛IllegalTransactionStateExceptionPROPAGATION_NOT_SUPPORTEDsuspend(transaction)挂起当前事务返回无实际事务的新状态PROPAGATION_REQUIRES_NEW挂起当前事务后startTransaction新建事务失败时resumeAfterBeginException恢复PROPAGATION_NESTED校验isNestedTransactionAllowed()否则抛NestedTransactionNotSupportedException若useSavepointForNestedTransaction()则在现有事务中创建保存点JDBC 3.0 保存点否则通过嵌套 begin/commit 创建其余SUPPORTS / REQUIRED参与现有事务若启用validateExistingTransaction还会校验隔离级别与只读标志与现存事务是否兼容不兼容即抛异常。5启动新事务AbstractPlatformTransactionManager#startTransaction决定是否启用事务同步getTransactionSynchronization() ! SYNCHRONIZATION_NEVER创建DefaultTransactionStatus状态对象随后调用模板方法doBegin(transaction, definition)真正开启底层事务最后prepareSynchronization准备事务同步。6JDBC 层开启事务DataSourceTransactionManager#doBegin若事务对象没有连接持有者或未与事务同步则从数据源getConnection()并包装为新的ConnectionHolder通过DataSourceUtils.prepareConnectionForTransaction应用隔离级别并记录previousIsolationLevel提交/回滚后用于还原若连接处于自动提交状态则切换为手动提交并记录mustRestoreAutoCommit调用prepareTransactionalConnection后将连接持有者标记为transactionActive根据定义计算超时determineTimeout并设置到连接持有者若为新的连接持有者通过TransactionSynchronizationManager.bindResource绑定到当前线程任何异常都会释放连接并抛CannotCreateTransactionException(Could not open JDBC Connection for transaction, ex)。7只读强化DataSourceTransactionManager#prepareTransactionalConnection当enforceReadOnly标志为true且定义为只读事务时执行SET TRANSACTION READ ONLY语句该方法自 Spring 4.3.7 提供Oracle、MySQL、Postgres 均可理解该语句。2. 提交事务的调用链1入口AbstractPlatformTransactionManager#commit若status.isCompleted()抛IllegalTransactionStateException同一事务不可重复提交/回滚若isLocalRollbackOnly()事务代码请求了回滚则processRollback(defStatus, false)若!shouldCommitOnGlobalRollbackOnly()且isGlobalRollbackOnly()全局标记仅回滚却请求提交则processRollback(defStatus, true)否则进入processCommit(defStatus)。2提交处理AbstractPlatformTransactionManager#processCommit按序执行prepareForCommit→triggerBeforeCommit→triggerBeforeCompletion随后分支处理存在保存点嵌套事务status.releaseHeldSavepoint()释放保存点新事务调用doCommit(status)真正提交若检测到全局回滚标记且出现意外回滚抛UnexpectedRollbackException(Transaction silently rolled back because it has been marked as rollback-only)提交异常时若isRollbackOnCommitFailure()则执行doRollbackOnCommitException否则以STATUS_UNKNOWN触发 afterCompletion成功路径最终触发triggerAfterCommit此处的异常会传播给调用者但事务仍视为已提交与triggerAfterCompletion(STATUS_COMMITTED)无论成败finally中执行cleanupAfterCompletion清理。3JDBC 层提交DataSourceTransactionManager#doCommit从状态对象中取出DataSourceTransactionObject再获取Connection执行con.commit()发生SQLException时通过translateException(JDBC commit, ex)转换为 Spring 事务异常抛出。3. 回滚事务的调用链1入口AbstractPlatformTransactionManager#rollback同样先校验status.isCompleted()已完成则抛异常随后将状态强转为DefaultTransactionStatus并委托processRollback(defStatus, false)。2回滚处理AbstractPlatformTransactionManager#processRollback先触发triggerBeforeCompletion有保存点则rollbackToHeldSavepoint()回滚到保存点嵌套事务局部回滚是新事务则调用doRollback(status)执行真实回滚参与较大事务时若本地回滚或isGlobalRollbackOnParticipationFailure()则doSetRollbackOnly(status)将现存事务标记为仅回滚否则交由事务发起方决定完成后触发triggerAfterCompletion(STATUS_ROLLED_BACK)若存在全局回滚标记且unexpectedRollback为真抛UnexpectedRollbackExceptionfinally中执行cleanupAfterCompletion。3JDBC 层回滚DataSourceTransactionManager#doRollback获取Connection后执行con.rollback()SQLException同样通过translateException(JDBC rollback, ex)转换抛出。八、总结PlatformTransactionManager是 Spring 命令式事务体系的策略核心getTransaction负责根据传播行为获取或创建事务commit/rollback负责最终提交与回滚TransactionStatus则贯穿始终承载事务状态。理解它就能从底层看懂Transactional注解、TransactionTemplate与TransactionInterceptor的运作本质而AbstractPlatformTransactionManager的模板方法设计doGetTransaction/doBegin/doCommit/doRollback也为我们扩展自定义事务管理器提供了清晰的骨架。本模块的 完整源码分析 与 可运行示例 值得结合 TransactionDefinition 模块 一起研读从而形成对 Spring 事务抽象完整闭环的认知。赞分享示例工程文档【免费下载链接】spring-reading涵盖了 Spring 框架的核心概念和关键功能包括控制反转IOC容器的使用面向切面编程AOP的原理与实践事务管理的方式与实现Spring MVC 的流程与控制器工作机制以及 Spring 中数据访问、安全、Boot 自动配置等方面的深入研究。此外它还包含了 Spring 事件机制的应用、高级主题如缓存抽象和响应式编程以及对 Spring 源码的编程风格与设计模式的深入探讨。项目地址https://gitcode.com/GitHub_Trending/sp/spring-reading点击查看免费下载相关推荐【免费下载】 深入理解Spring事务管理PlatformTransactionManager核心解析深入理解Spring事务管理PlatformTransactionManager核心解析 概述 在Spring框架中事务管理是一个至关重要的功能模块。 Pl示例工程文档Spring与事务处理声明式事务设计与PlatformTransactionManager源码深度解析Spring与事务处理声明式事务设计与PlatformTransactionManager源码深度解析 JavaEE 应用中的事务处理是一个重要且涉及范围很广文档教程知识库Spring Framework 编程式事务管理深度解析Spring Framework 编程式事务管理深度解析 引言为什么需要编程式事务管理 在企业级应用开发中事务管理是确保数据一致性和完整性的核心技术。虽然后端Web框架依赖注入上一篇模型进了 Blender 就变成一团乱麻用 io_scene_psk_psa 插件一次搞定 PSK/PSA 转换下一篇Blender 导入虚幻引擎 PSK/PSA 文件终极教程用 io_scene_psk_psa 插件一次搞定模型与动画创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考