大致内容

特别注意

@Transactional 本质上是利用某个数据库的事务管理器,那么就无法做到多个数据源使用同一个事务。

在多数据源的情况下,即使每个事务都只涉及其中的一个数据源,那么也需要指定 @Transactional 使用的事务管理器,spring 无法通过代理分析处到底使用哪个事务管理器,只会事务默认的那个,那么就会造成事务管理器和数据库不匹配从而失效。

简单多数据源事务

如果在一个事务中使用了多个数据库,那么可以考虑使用 ChainedTransactionManager(使用 @Bean 的方式创建,并且需要注入数据源对应的事务处理器),并且在 @Transactional 中指明。

标准多数据源事务

考虑使用 Atomikos 作为 JTATransactionManager 实现,相关的扩展还包括 spring 中的动态数据源等,网上资料很多,不作展开。

大致原理

事务的两段提交
  • 准备阶段:事务管理器收集所有事务的执行情况(这些事务都未提交)。
  • 提交阶段:如果所有的事务都执行成功(超时未响视为执行失败),那么提交所有的事务,否则回滚所有的事务。

具体原理可移步:全局事务 | 凤凰架构 (icyfenix.cn)