直接用transactiontemplate控制事务边界,核心是将业务逻辑放入execute()方法中,它自动处理事务开启、异常捕获及提交或回滚;需配置好platformtransactionmanager,建议声明为bean注入使用,并可通过transactiondefinition灵活设置传播行为、隔离级别、超时等属性。

直接用 TransactionTemplate 控制事务边界,核心就一句话:把要走事务的业务逻辑塞进 execute() 方法里,它自动帮你开事务、捕异常、提交或回滚。
事务模板实例必须配好事务管理器
TransactionTemplate 本身不干活,它依赖 PlatformTransactionManager(比如 DataSourceTransactionManager)执行真实操作。Spring Boot 中通常自动配置,但需确保数据源和事务管理器已正确定义:
- Spring Boot 2.6+ 默认启用
@EnableTransactionManagement,只要存在DataSource和对应PlatformTransactionManagerBean 就可用 - 手动配置时,Bean 定义示例:
```java
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
``` -
TransactionTemplate实例建议声明为 Bean,方便注入使用:
```java
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager tm) {
return new TransactionTemplate(tm);
}
```
execute 方法封装事务全过程
调用 transactionTemplate.execute(...) 即启动一个完整事务生命周期。内部按顺序执行:
- 调用
getTransaction()获取事务状态(根据传播行为决定新建/加入/挂起) - 在 try 块中执行你传入的
TransactionCallback逻辑 - 遇到
RuntimeException或Error→ 自动标记回滚并抛出原异常 - 遇到受检异常(
Exception)→ 默认也回滚(可定制规则) - 无异常 → 调用
commit()提交
无需手写 try-catch-commit-rollback 模板代码,所有样板逻辑已被封装。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
灵活控制事务属性靠 TransactionDefinition
默认使用 DefaultTransactionDefinition(传播行为 REQUIRED,隔离级别 DEFAULT),但你可以随时覆盖:
- 设置新事务:用
PROPAGATION_REQUIRES_NEW避免嵌套影响 - 读操作优化:设
setReadOnly(true)提示数据库做只读优化 - 防长事务:通过
setTimeout(30)设超时(单位秒) - 指定隔离级别:如
ISOLATION_READ_COMMITTED防脏读
示例:
```java
TransactionTemplate tt = new TransactionTemplate(transactionManager);
tt.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
tt.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
tt.setTimeout(15);
tt.execute(status -> {
// 业务逻辑
return null;
});
```
回滚控制不止靠异常类型
默认对所有未检查异常(RuntimeException 及子类)和 Error 回滚,但你有更多主动权:
- 手动标记回滚:
status.setRollbackOnly(),适合业务判断后强制回滚(比如校验失败) - 忽略某些异常不回滚:在回调中 catch 特定异常并吞掉,不抛出即可
- 自定义回滚规则:继承
TransactionTemplate或使用TransactionTemplate的变体(如配合TransactionTemplate+TransactionAspectSupport.currentTransactionStatus())
注意:一旦调用 setRollbackOnly(),后续即使没异常也会回滚,且无法撤销。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










