青岛品牌网站建设价格,外贸网站 在线留言,wordpress 附件太小,网站的配置标题1 前言
在使用单个服务#xff0c;多数据源时#xff0c;也存在分布式事务问题。
当单体系统需要访问多个数据库#xff08;实例#xff09;时就会产生分布式事务。 比如#xff1a;用户信 息和订单信息分别在两个MySQL实例存储#xff0c;用户管理系统删除用户信息多数据源时也存在分布式事务问题。
当单体系统需要访问多个数据库实例时就会产生分布式事务。 比如用户信 息和订单信息分别在两个MySQL实例存储用户管理系统删除用户信息需要分别删除用户信息及用户的订单信 息由于数据分布在不同的数据实例需要通过不同的数据库链接去操作数据此时产生分布式事务。 简言之跨数据库实例产生分布式事务。 2 问题场景
参考此文档搭建一个多数据源项目Mybatis-Plus入门系列(19) -多数据源使用详解。
在插入订单数据时模拟一个异常 OverrideDS(db_order)Transactionalpublic void insertOrder() {// 插入订单OrderTbl orderTbl new OrderTbl();orderTbl.setUserId(12);orderTbl.setCommodityCode(IPHONE 13);orderTbl.setCount(1);orderTblMapper.insert(orderTbl);int i 5 / 0;}
当进行业务操作时订单发生异常 进行了回滚操作因为在不同的数据库实例中余额却扣除成功此时发现数据不一致问题。
3 使用Seata 解决多数据源事务问题
3.1 集成Nacos Seata
参考该系列给当前服务添加Nacos Seata 相关依赖并启动Nacos Seata 。
3.2 多数据源集成Seata
多数据源集成Seata 时主要是需要修改一下几个配置即可。
多数据源中开启分布式事务设置事务模式 datasource:# 多数据源dynamic:# 省略其他 # 开启分布式事务seata: true# 事务模式 为ATseata-mode: AT
seata 中关闭数据源自动代理
seata:# 是否开启spring-boot自动装配默认true包括数据源的自动代理以及GlobalTransactionScanner初始化enabled: true# 是否开启数据源自动代理默认开启enable-auto-data-source-proxy: false
3.3 测试
添加GlobalTransactional注解。 GlobalTransactionalGetMapping(/test)public Object test() throws InterruptedException {accountTblService.reduceMoney();orderTblService.insertOrder();return 执行完毕;}
测试发现异常时余额和订单服务都进行了回滚集成成功。