Spring中编程式事务通过TransactionTemplate显式控制事务,封装PlatformTransactionManager操作,支持带/无返回值回调、自定义传播行为与隔离级别,线程安全且自动处理回滚。

Spring 中编程式事务不依赖注解或 AOP,而是通过代码显式控制事务的开启、提交与回滚。最常用且推荐的方式是使用 TransactionTemplate 模板类,它封装了底层 PlatformTransactionManager 的繁琐操作,让开发者专注业务逻辑。
TransactionTemplate 的核心作用
它把“获取事务 → 执行业务 → 成功提交 / 异常回滚”这一固定流程模板化,避免手动调用 TransactionStatus、transactionManager.commit() 等底层 API,降低出错风险,提升可读性与一致性。
基本使用步骤
- 确保 Spring 容器中已配置好
PlatformTransactionManager(如DataSourceTransactionManager) - 注入
TransactionTemplate(通常通过构造注入或@Autowired) - 调用
execute()方法,传入TransactionCallback或TransactionCallbackWithoutResult - 在回调中编写需要事务保护的业务代码,返回值(如有)将作为
execute()的结果
常见写法示例
带返回值(推荐用于查询或需结果的场景):
public User createUser(String name, String email) {
return transactionTemplate.execute(status -> {
User user = new User(name, email);
userMapper.insert(user);
log.info("用户已插入:{}", user.getId());
return user; // 作为 execute() 的返回值
});
}
无返回值(适合纯更新、删除等操作):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
transactionTemplate.execute(status -> {
try {
accountMapper.decreaseBalance(fromId, amount);
accountMapper.increaseBalance(toId, amount);
} catch (Exception e) {
status.setRollbackOnly(); // 显式标记回滚(非必须,抛异常也会触发)
throw e;
}
});
}
自定义事务行为(隔离级别、传播行为等)
可通过 TransactionTemplate 设置事务属性,例如:
@Autowired
private PlatformTransactionManager transactionManager;
@Bean
public TransactionTemplate transactionTemplate() {
TransactionTemplate template = new TransactionTemplate(transactionManager);
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
template.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
template.setTimeout(30); // 秒
return template;
}
也可在每次调用时临时覆盖:
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); transactionTemplate.execute(...);
注意事项
-
TransactionTemplate是线程安全的,可被多个 Bean 共享使用 - 回调内抛出 未检查异常(RuntimeException 及其子类) 会自动触发回滚;检查异常默认不回滚,需通过
setRollbackRules()显式配置 - 不要在回调中手动管理连接或事务状态(如调用
status.isCompleted()判断),模板已处理 - 若需更细粒度控制(如嵌套事务、保存点),可考虑直接使用
TransactionStatus,但应优先用模板
不复杂但容易忽略:事务生效的前提是目标方法由 Spring 代理对象调用,避免在同一个类中 self-invocation(即本类内部直接调用),否则事务失效。


















