动态数据源的事务管理

动态数据源的事务管理
零,事务管理类型
  • 单体单数据源,本地事务,用 @Transactional / @EnableTransactionManagement 即可
  • 单体多数据源,需要对SpringBoot的事务管理进行改造
  • 多实例多数据源,本地消息表 / 分布式事务框架
一,方案一
  • 解决方案: PlatformTransactionManager + AbstractRoutingDataSource + ThreadLocal + DataSource + 数据源连接池
(1) 实现SpringBoot下的PlatformTransactionManager事务管理器接口 ——> A
(2) 继承jdbc/jdbc-starter的AbstractRoutingDataSource 抽象类 ——> B
(3)B作为A的构造参数注入Spring容器
(4)ThreadLocal作为当前线程所使用数据源的缓存类——>C
  • 注意SpringBoot的事务管理也是基于AOP实现的,需要先进行数据源切换在进行事务管理,所以此处数据源切换的顺序优先于事务管理顺序
  • 使用时,正常使用 @Transactional / @EnableTransactionManagement就可以
二,方案二
  • 解决方案: spring-boot-starter-jta-atomikos + AbstractRoutingDataSource +PlatformTransactionManager + ThreadLocal + DataSource + 数据源连接池
  • 该方案与方案一差不多,jta是基于2PC 分布式事务协议与基于SpringBoot 拓展规范实现的事务框架
  • 实现步骤是 AbstractRoutingDataSource 数据源注入jta —> jta的事务管理器注入PlatformTransactionManager
    • 注意SpringBoot的事务管理也是基于AOP实现的,需要先进行数据源切换在进行事务管理,所以此处数据源切换的顺序优先于事务管理顺序
  • 使用时,正常使用 @Transactional / @EnableTransactionManagement就可以
三,方案三
  • 基于 Mybatis-plus 的 这个 dynamic-datasource-spring-boot-starter 组件思路去完成事务控制,或者直接使用 dynamic-datasource-spring-boot-starter做事务控制
四,方案四
  • 本地消息表

消息生产方,需要额外建一个消息表,并记录消息发送状态。消息表和业务数据要在一个事务里提交,也就是说他们要在一个数据库里面。然后消息会经过 MQ 发送到消息的消费方。如果消息发送失败,会进行重试发送。

消息消费方,需要处理这个消息,并完成自己的业务逻辑。此时如果本地事务处理成功,表明已经处理成功了,如果处理失败,那么就会重试执行。如果是业务上面的失败,可以给生产方发送一个业务补偿消息,通知生产方进行回滚等操作。

生产方和消费方定时扫描本地消息表,把还没处理完成的消息或者失败的消息再发送一遍。如果有靠谱的自动对账补账逻辑,这种方案还是非常实用的。

五,方案五
  • 分布式事务
    • 2PC (也叫作XA事务)
    • 3PC
    • TCC (也叫作补偿事务)
    • SAGA
    • 本地消息表
    • 消息事务
    • 最大努力通知
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值