编程式事务用transactiontemplate控制边界,核心是代码显式定义原子操作范围,绕过声明式事务失效场景;execute()严格界定事务起止,自动提交/回滚;回调内仅放db操作,支持属性定制、回调类型区分及事务管理器绑定。

编程式事务用 TransactionTemplate 控制边界,核心是把“哪些操作必须原子执行”这件事完全交由代码决定,而不是靠注解或AOP切面自动包裹。它不依赖方法签名或代理机制,因此能绕过声明式事务的常见失效场景(比如自调用、非public方法、异常类型不匹配等),真正实现按需启停。
明确事务起止点,用 execute() 封装关键逻辑
事务边界由 execute() 方法的调用范围严格定义——方法体内部所有数据库操作都在同一事务上下文中运行,一旦退出就自动提交或回滚。不需要手动调用 commit/rollback,框架在回调结束时根据执行结果和异常情况自动处理。
- 回调里只放真正需要事务保障的操作,比如“扣库存 + 记日志 + 更新订单状态”,避免把查询、校验、远程调用等非DB操作也裹进去
- 不要在回调外做数据库写操作,否则会脱离当前事务,造成部分成功部分失败
- 若需提前回滚,调用
status.setRollbackOnly(),比抛异常更可控(尤其当异常被 catch 后仍想回滚时)
定制事务属性,适配不同业务场景
默认使用 PROPAGATION_REQUIRED 和 ISOLATION_DEFAULT,但可通过构造或 setter 精确调整:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 嵌套操作需独立事务?设
PROPAGATION_REQUIRES_NEW,避免外层失败影响内层 - 只读查询?设
setReadOnly(true),提示数据库优化(如MySQL可走只读事务路径) - 长耗时操作?设
setTimeout(30)(单位秒),防止事务长时间挂起阻塞连接池 - 高一致性要求?设
ISOLATION_SERIALIZABLE,但注意性能开销,一般READ_COMMITTED已足够
区分回调类型,避免返回值干扰逻辑
TransactionCallback 用于有返回值的场景(如查出数据后更新并返回新对象),TransactionCallbackWithoutResult 更常用——它不强制返回值,语义更清晰,也减少误写 return 导致的意外中断。
- 用 Lambda 写法更简洁:
transactionTemplate.execute(status -> { update1(); update2(); }) - 若回调中抛出 RuntimeException,默认回滚;检查型异常(Exception)默认不回滚,需显式配置
setRollbackOnException()或在 catch 中调setRollbackOnly() - 不要在回调里再嵌套另一个
execute(),除非确实需要独立事务——否则易引发连接争用或死锁
与事务管理器绑定,确保底层一致
TransactionTemplate 本身不管理事务生命周期,它只是模板,真正干活的是注入的 PlatformTransactionManager(如 DataSourceTransactionManager)。必须确认:
- 使用的事务管理器与当前数据源(
DataSource)是同一个实例,否则事务无法生效 - 多个数据源时,每个
TransactionTemplate实例应绑定对应的数据源事务管理器 - Spring Boot 自动配置下,通常只需
@Autowired TransactionTemplate,但自定义多数据源时需手动指定 bean 名称
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










