TransactionTemplate是Spring提供的编程式事务管理工具,适用于需显式控制事务边界、动态决定回滚、绕过AOP代理限制等场景;通过execute()执行回调,支持自定义传播行为、隔离级别、手动回滚及保存点。

TransactionTemplate 是 Spring 提供的声明式事务编程工具,适合在代码中显式控制事务边界(比如需要动态决定是否回滚、或事务逻辑不在方法级别时)。它不依赖 AOP,直接通过模板方法执行事务性操作,比 @Transactional 更灵活,也更轻量。
1. 基础配置:注入 TransactionTemplate
确保 Spring 容器中已配置了 PlatformTransactionManager(如 DataSourceTransactionManager),然后注入 TransactionTemplate:
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager txManager) {
return new TransactionTemplate(txManager);
}
通常只需一个默认实例;如需不同传播行为或隔离级别,可创建多个命名 Bean 或运行时配置。
2. 执行事务性逻辑:execute() 方法
调用 execute(),传入 TransactionCallback(有返回值)或 TransactionCallbackWithoutResult(无返回值):
立即学习“Java免费学习笔记(深入)”;
- 成功执行:回调方法正常返回,事务自动提交
- 抛出运行时异常(
RuntimeException)或Error:事务自动回滚 - 检查型异常(
Exception)默认不触发回滚,需手动设置setRollbackOnException(true)
// 有返回值
String result = transactionTemplate.execute(status -> {
userDao.insert(user);
orderDao.create(order);
return "success";
});
// 无返回值(推荐用于简单场景)
transactionTemplate.execute(status -> {
userDao.updateBalance(userId, -amount);
logDao.save("Deducted " + amount);
});
3. 自定义事务属性(传播行为、超时等)
可通过 TransactionTemplate 实例或新建匿名子类调整事务行为:
- 设置传播行为:
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); - 设置超时(秒):
template.setTimeout(30); - 设置只读:
template.setReadOnly(true);(对 JDBC 连接和二级缓存有优化作用) - 指定回滚规则:
template.setRollbackOnException(true);或使用setRollbackRules(...)精确控制
4. 主动回滚与保存点(进阶用法)
在回调中可通过 TransactionStatus 对象实现细粒度控制:
-
status.setRollbackOnly():标记当前事务为仅回滚(不抛异常也能回滚) -
status.createSavepoint()/status.rollbackToSavepoint(sp):支持嵌套回滚(需底层事务管理器支持,如 JDBC)
transactionTemplate.execute(status -> {
userDao.insert(user);
Object savepoint = status.createSavepoint();
try {
paymentService.charge(user, amount);
} catch (PaymentFailedException e) {
status.rollbackToSavepoint(savepoint); // 撤销支付部分,保留用户插入
}
});
TransactionTemplate 适用于需要程序化事务控制的场景,比如条件化提交、补偿逻辑、或整合非 Spring 管理的资源。它简洁明确,避免了 AOP 的隐式行为,但也要注意勿滥用——多数业务方法仍优先用 @Transactional 保持声明清晰。


















