
示例工程文档【免费下载链接】spring-reading涵盖了 Spring 框架的核心概念和关键功能包括控制反转IOC容器的使用面向切面编程AOP的原理与实践事务管理的方式与实现Spring MVC 的流程与控制器工作机制以及 Spring 中数据访问、安全、Boot 自动配置等方面的深入研究。此外它还包含了 Spring 事件机制的应用、高级主题如缓存抽象和响应式编程以及对 Spring 源码的编程风格与设计模式的深入探讨。项目地址https://gitcode.com/GitHub_Trending/sp/spring-reading点击查看免费下载导读TransactionTemplate是 Spring Framework 提供的编程式事务管理工具类它让我们能够在代码中显式地划定事务边界而不必依赖容器或 AOP 代理的声明式管理。本文以 spring-reading 仓库中的 spring-transaction-transactionTemplate 模块为核心完整讲解其启动/提交/回滚机制、异常处理策略、事务属性配置与回调机制并结合仓库源码与可运行的示例代码帮助读者掌握用TransactionTemplate编写可靠、可复用的事务代码的完整实战方案。一、TransactionTemplate 是什么TransactionTemplate位于org.springframework.transaction.support包是 Spring Framework 提供的工具类用于在代码中以编程方式管理事务。它简化了事务的启动、提交/回滚以及异常处理同时允许灵活配置事务属性并提供了回调机制以执行特定操作。与声明式事务基于Transactional注解或 XML 配置相比编程式事务的最大优势在于事务边界完全由业务代码掌控适用于那些需要在一个方法内部动态决定事务范围、或者事务逻辑需要根据运行时条件变化的场景。在 spring-reading 仓库中该模块的完整示例位于 TransactionTemplateDemo.java配套的 Maven 模块配置见 pom.xml。二、核心功能一览1. 事务的启动和提交/回滚允许我们以编程方式启动事务并在需要时提交或回滚事务。这种方式使得我们可以在代码的特定部分明确定义事务的边界而不必依赖于容器管理。2. 异常处理提供了对异常的处理机制我们可以通过配置指定在发生异常时应该执行的操作比如回滚事务。TransactionTemplate默认对RuntimeException与Error自动回滚对受检异常则回滚并包装抛出UndeclaredThrowableException。3. 事务属性的灵活配置我们可以使用TransactionTemplate配置各种事务属性如隔离级别、传播行为等。这使得我们可以针对不同的场景灵活地配置事务行为。注意TransactionTemplate本身实现了TransactionDefinition接口继承自DefaultTransactionDefinition因此可以直接设置传播行为、隔离级别、超时、只读等属性。4. 回调机制允许我们定义回调接口TransactionCallbackT/TransactionCallbackWithoutResult通过这些回调接口我们可以在事务的不同阶段执行特定的操作。这为更复杂的事务场景提供了更大的灵活性例如在事务内执行多条 SQL、组合多个 DAO 操作保证它们要么全部提交、要么全部回滚。三、与 PlatformTransactionManager 的关系要理解TransactionTemplate必须先理解它的底层依赖——PlatformTransactionManager。它是 Spring 事务抽象的核心接口负责事务的开启getTransaction、提交commit与回滚rollback。TransactionTemplate的构造器要求传入一个PlatformTransactionManager实例public TransactionTemplate(PlatformTransactionManager transactionManager)在本模块的示例中使用的是DataSourceTransactionManager面向 JDBC 数据源的事务管理器。与之对比仓库中的 spring-transaction-platformTransactionManager 模块展示了不使用模板的纯手写编程式事务写法DefaultTransactionDefinition definition new DefaultTransactionDefinition(DefaultTransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus transactionStatus transactionManager.getTransaction(definition); try { // 业务操作... transactionManager.commit(transactionStatus); } catch (Exception e) { transactionManager.rollback(transactionStatus); e.printStackTrace(); }对比可见手写方式需要开发者自行保证commit/rollback的正确配对与异常分支处理稍有不慎就会漏掉回滚路径而TransactionTemplate把这一套样板逻辑封装进execute方法内部开发者只需聚焦业务回调显著降低了出错概率。四、最佳实践完整可运行示例4.1 环境准备本仓库基于 Spring 5.2.15.RELEASE、MySQL 8.0.30、Java 11 构建见根 pom.xml 中的版本属性。需要先准备一张表scores建表 SQL 见 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;4.2 示例代码完整源码见 TransactionTemplateDemo.java核心步骤如下public class TransactionTemplateDemo { 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 对象用于管理事务 DataSourceTransactionManager transactionManager new DataSourceTransactionManager(dataSource); // 创建 JdbcTemplate 对象用于执行 SQL 语句 JdbcTemplate jdbcTemplate new JdbcTemplate(dataSource); // 创建事务模板 TransactionTemplate transactionTemplate new TransactionTemplate(transactionManager); Boolean insertSuccess transactionTemplate.execute(new TransactionCallbackBoolean() { Override public Boolean doInTransaction(TransactionStatus status) { // 主键Id 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; // 我们也可以使用setRollbackOnly来回滚 // status.setRollbackOnly(); // 返回是否新增成功 return row 1; } }); System.out.println(新增scores表数据 insertSuccess); } }4.3 代码解读数据源使用SimpleDriverDataSource包装 MySQL 驱动提供连接信息。生产环境通常会换成连接池如 HikariCP、Druid。事务管理器DataSourceTransactionManager是面向 JDBC 的PlatformTransactionManager实现负责连接与事务的绑定。JdbcTemplate用于在回调内执行 SQL与TransactionTemplate共享同一个数据源保证两者获取的是同一个数据库连接由事务同步机制保证。回调TransactionCallbackBoolean的doInTransaction方法内执行插入操作并返回结果。模板会在回调结束后统一提交。手动回滚示例注释中提供了两种主动回滚方式——抛异常如int i 1 / 0;或调用status.setRollbackOnly()。setRollbackOnly特别适用于业务校验不通过但不想抛异常的场景。4.4 运行结果数据库操作成功完成并成功提交了事务新增scores表数据true如果把int i 1 / 0;注释打开回调内抛出ArithmeticException运行时异常模板会捕获并按rollbackOnException逻辑回滚事务此时控制台不会输出该行或输出false取决于回滚后的返回路径数据库中也不会残留任何插入记录。五、源码分析execute 的核心执行流程TransactionTemplate#execute是整个模板的发动机。源码位于org.springframework.transaction.support.TransactionTemplate#executeOverride Nullable public T T execute(TransactionCallbackT action) throws TransactionException { // 断言确保已设置PlatformTransactionManager Assert.state(this.transactionManager ! null, No PlatformTransactionManager set); // 如果事务管理器是CallbackPreferringPlatformTransactionManager的实例 if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) { // 使用CallbackPreferringPlatformTransactionManager执行事务 return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action); } else { // 获取事务状态 TransactionStatus status this.transactionManager.getTransaction(this); T result; try { // 执行事务回调操作 result action.doInTransaction(status); } catch (RuntimeException | Error ex) { // 事务中的代码抛出应用程序异常 - 回滚事务 rollbackOnException(status, ex); throw ex; } catch (Throwable ex) { // 事务中的代码抛出意外异常 - 回滚事务 rollbackOnException(status, ex); throw new UndeclaredThrowableException(ex, TransactionCallback threw undeclared checked exception); } // 提交事务 this.transactionManager.commit(status); return result; } }5.1 执行流程拆解前置校验通过Assert.state确保PlatformTransactionManager已被设置否则抛出异常提示 No PlatformTransactionManager set。双路径分派若事务管理器是CallbackPreferringPlatformTransactionManager例如 JTA 环境下部分实现则直接把this与回调交给管理器执行——这类管理器自带回调用例优化否则走通用路径getTransaction(this)开启事务这里this本身就是一个TransactionDefinition其传播行为/隔离级别等属性即被用于开启事务。回调执行调用action.doInTransaction(status)将TransactionStatus暴露给回调便于回调内调用setRollbackOnly()。异常分类回滚RuntimeException | Error→ 应用异常回滚后原样抛出其他Throwable受检异常→ 回滚后包装为UndeclaredThrowableException抛出因为execute签名未声明受检异常。正常提交回调无异常返回后调用transactionManager.commit(status)提交事务并返回回调结果。5.2 rollbackOnException回滚的兜底逻辑org.springframework.transaction.support.TransactionTemplate#rollbackOnException负责安全地执行回滚/** * 在应用异常时执行回滚正确处理回滚异常。 * param status 表示事务的对象 * param ex 抛出的应用程序异常或错误 * throws TransactionException 如果发生回滚错误 */ private void rollbackOnException(TransactionStatus status, Throwable ex) throws TransactionException { // 断言确保已设置PlatformTransactionManager Assert.state(this.transactionManager ! null, No PlatformTransactionManager set); // 打印调试日志表示在应用异常时启动事务回滚 logger.debug(Initiating transaction rollback on application exception, ex); try { // 执行事务回滚 this.transactionManager.rollback(status); } catch (TransactionSystemException ex2) { // 打印错误日志表示应用异常被回滚异常覆盖 logger.error(Application exception overridden by rollback exception, ex); // 初始化应用程序异常 ex2.initApplicationException(ex); throw ex2; } catch (RuntimeException | Error ex2) { // 打印错误日志表示应用异常被回滚异常覆盖 logger.error(Application exception overridden by rollback exception, ex); throw ex2; } }该方法的职责在于即使回滚本身也抛出了异常也绝不丢失原始业务异常。通过initApplicationException把原始异常挂载到TransactionSystemException上或者直接重新抛出回滚异常并记录 error 日志保证失败原因可追溯。六、事务属性配置传播行为与隔离级别TransactionTemplate继承自DefaultTransactionDefinition因此可以在执行前通过 setter 灵活配置事务属性详见仓库中 spring-transaction-transactionDefinition/README.md 的完整属性清单TransactionTemplate transactionTemplate new TransactionTemplate(transactionManager); // 设置传播行为REQUIRES_NEW挂起当前事务新建一个事务 transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 设置隔离级别可重复读 transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ); // 设置超时时间秒 transactionTemplate.setTimeout(30); // 设置为只读事务可提示底层做优化 transactionTemplate.setReadOnly(true);6.1 传播行为Propagation常量值语义PROPAGATION_REQUIRED0支持当前事务不存在则新建默认值PROPAGATION_SUPPORTS1支持当前事务不存在则以非事务方式执行PROPAGATION_MANDATORY2必须存在当前事务否则抛异常PROPAGATION_REQUIRES_NEW3总是新建事务挂起当前事务PROPAGATION_NOT_SUPPORTED4总是以非事务方式执行挂起当前事务PROPAGATION_NEVER5禁止存在事务否则抛异常PROPAGATION_NESTED6嵌套事务存在当前事务时6.2 隔离级别Isolation常量值对应 JDBC 级别可解决的问题ISOLATION_DEFAULT-1使用底层存储默认值-ISOLATION_READ_UNCOMMITTED1TRANSACTION_READ_UNCOMMITTED无允许脏读ISOLATION_READ_COMMITTED2TRANSACTION_READ_COMMITTED脏读ISOLATION_REPEATABLE_READ4TRANSACTION_REPEATABLE_READ脏读、不可重复读ISOLATION_SERIALIZABLE8TRANSACTION_SERIALIZABLE脏读、不可重复读、幻读注意隔离级别与超时设置仅在实际启动新事务时生效即传播行为为REQUIRED/REQUIRES_NEW/NESTED且当前无事务时非默认值还可能触发不支持该特性的事务管理器抛异常。七、无返回值场景TransactionCallbackWithoutResult如果业务操作不需要返回结果可以使用TransactionCallbackWithoutResult减少样板代码transactionTemplate.execute(new TransactionCallbackWithoutResult() { Override protected void doInTransactionWithoutResult(TransactionStatus status) { jdbcTemplate.update(insert into scores(id,score) values(?,?), id, score); jdbcTemplate.update(insert into scores_log(id,score_id,create_time) values(?,?,?), logId, id, now); } });它内部通过适配器把无返回值转换为返回null的回调事务语义与TransactionCallbackT完全一致。八、适用场景与注意事项推荐使用TransactionTemplate的场景需要在同一个方法内多次开启/提交不同事务事务边界随业务分支变化需要动态决定事务属性如根据参数切换传播行为或隔离级别希望把事务逻辑与 AOP 代理解耦避免Transactional在自调用同类内部方法调用时失效的问题在批量任务、定时任务、消息消费等非 Web 入口中做局部事务控制。注意事项回调内的数据库访问必须与事务管理器使用同一个数据源否则事务无法覆盖该操作示例中JdbcTemplate与DataSourceTransactionManager共享同一个dataSource受检异常会触发回滚并被包装为UndeclaredThrowableException如需对特定受检异常不回滚需要自行在回调内捕获处理setRollbackOnly()只是标记回滚事务的最终回滚动作仍由模板在回调返回后执行通常配合在回调内提前return使用TransactionTemplate是线程安全的可作为单例 Bean 复用例如注入 Spring 容器后全局共享不要在每个业务方法里重复 new。九、小结TransactionTemplate把PlatformTransactionManager的开启、提交、回滚样板逻辑浓缩为一个execute方法配合TransactionCallback回调机制成为 Spring 编程式事务的推荐写法。通过本文的示例与源码拆解可以看到模板内部通过异常分类回滚 提交兜底 原始异常保留三重机制保证了事务边界的严谨性与失败信息的可追溯性。如需进一步深入可在本仓库中对比阅读spring-transaction-platformTransactionManager底层事务管理器直接用法、spring-transaction-transactionDefinition事务属性定义全解析以及 spring-transaction-transactionInterceptor声明式事务的拦截器实现从而建立起从编程式到声明式事务的完整知识脉络。赞分享示例工程文档【免费下载链接】spring-reading涵盖了 Spring 框架的核心概念和关键功能包括控制反转IOC容器的使用面向切面编程AOP的原理与实践事务管理的方式与实现Spring MVC 的流程与控制器工作机制以及 Spring 中数据访问、安全、Boot 自动配置等方面的深入研究。此外它还包含了 Spring 事件机制的应用、高级主题如缓存抽象和响应式编程以及对 Spring 源码的编程风格与设计模式的深入探讨。项目地址https://gitcode.com/GitHub_Trending/sp/spring-reading点击查看免费下载相关推荐深入理解Spring TransactionTemplate编程式事务管理利器深入理解Spring TransactionTemplate编程式事务管理利器 概述 在Spring框架中事务管理是一个核心功能而 Transaction示例工程文档GitHub_Trending/sp/spring-reading事务管理编程式事务实现GitHub_Trending/sp/spring reading事务管理编程式事务实现 引言编程式事务的必要性与挑战 在企业级应用开发中数据一致性是核心示例工程文档Spring Framework 编程式事务管理深度解析Spring Framework 编程式事务管理深度解析 引言为什么需要编程式事务管理 在企业级应用开发中事务管理是确保数据一致性和完整性的核心技术。虽然后端Web框架依赖注入上一篇终极MiMoCode指南如何零配置快速接入AI编程助手并提升开发效率下一篇使用 aws_codebuild_fleet 数据源查询 AWS CodeBuild 计算舰队信息创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考