transactiontemplate 是 spring 中手动控制事务边界的轻量级方式,适用于动态决定事务、跨方法事务或非 spring 管理类中临时使用;需配置 bean 并注入使用 execute() 执行回调,支持自定义传播行为、隔离级别和回滚规则。

在 Spring 中,TransactionTemplate 是手动控制事务边界的轻量级方式,适合不适合用 @Transactional 注解的场景(比如动态决定是否开启事务、事务逻辑跨多个方法、或在非 Spring 管理的类中临时需要事务)。
1. 配置 TransactionTemplate Bean
确保项目已启用事务管理(如添加 @EnableTransactionManagement),并声明一个 TransactionTemplate Bean,绑定到你的 PlatformTransactionManager:
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
}
如果使用 JPA,通常 transactionManager 是 JpaTransactionManager;如果是 JDBC,则为 DataSourceTransactionManager。
2. 在 Service 中注入并执行事务逻辑
通过 execute() 方法传入 TransactionCallback 或其简化接口 TransactionCallbackWithoutResult:
-
有返回值:用
TransactionCallback<t></t> -
无返回值:推荐用
TransactionCallbackWithoutResult(避免空返回处理)
示例(带返回值):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@Service
public class OrderService {
private final TransactionTemplate transactionTemplate;
private final OrderRepository orderRepository;
private final StockService stockService;
public OrderService(TransactionTemplate transactionTemplate,
OrderRepository orderRepository,
StockService stockService) {
this.transactionTemplate = transactionTemplate;
this.orderRepository = orderRepository;
this.stockService = stockService;
}
public Order createOrder(OrderRequest request) {
return transactionTemplate.execute(status -> {
// 扣减库存(可能抛异常)
stockService.deductStock(request.getProductId(), request.getCount());
// 创建订单
Order order = new Order(request);
orderRepository.save(order);
return order; // 返回结果会被 execute() 原样返回
});
}
}
3. 控制事务行为(传播性、隔离级别等)
TransactionTemplate 默认使用 PROPAGATION_REQUIRED 和数据库默认隔离级别。如需自定义,可构建时配置:
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
TransactionTemplate template = new TransactionTemplate(transactionManager);
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
template.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
template.setTimeout(30); // 秒
return template;
}
常用传播行为:
– PROPAGATION_REQUIRED(默认):有则加入,无则新建
– PROPAGATION_REQUIRES_NEW:总是新建事务(挂起当前)
– PROPAGATION_NOT_SUPPORTED:以非事务方式运行(挂起当前)
4. 异常与回滚控制
TransactionTemplate 默认只对 RuntimeException 和 Error 回滚。若需对受检异常也回滚,需显式设置:
template.setRollbackOn(new Class[]{IOException.class, CustomException.class});
或者在回调中主动触发回滚:
transactionTemplate.execute(status -> {
try {
doSomething();
} catch (CustomException e) {
status.setRollbackOnly(); // 标记当前事务仅回滚
throw e;
}
return result;
});
注意:setRollbackOnly() 不会中断执行,只是让事务最终回滚;异常仍需向上抛出或处理。
不复杂但容易忽略的是:确保回调内所有数据访问都走 Spring 代理的 Bean(如 @Autowired 的 Repository/Service),否则可能绕过事务上下文。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










