其他分享
首页 > 其他分享> > 基于LCN解决分布式事务

基于LCN解决分布式事务

作者:互联网

  1. 下载LCN
     地址: https://github.com/codingapi/tx-lcn/tree/4.1.0  我这里下的是4.1.0版本

     解压
     
    目前LCN版本已经升级为4.0以上了,但是官方没有SpringCloud2.0的demo案例。需要对源码进行修改,支持SpringCloud2.0版本,修改源码参考大佬文档: https://www.jianshu.com/p/453741e0f28f
    --否则整合的时候会报错,注意我这里是修改过的,
  2. 导入到你的项目中
     
  3. 修改tx-manager的application.preperties配置信息
     
    a、修改redis链接地址和密码
    b、修改eureka的服务注册地址
    tm.compensate.maxWaitTime=5000  根据自己需求更改
  4. 启动
     启动你的eureka-server项目
     启动tx-manager项目  启动类:TxManagerApplication.java
  5. 测试
     地址  http://127.0.0.1:8899/
  6. 启动成功后最好手动mvn install到你的maven仓库中去    --入过坑
  1. 在订单服务和会员服务工程中都引入依赖
     
     <!--lcn相关依赖-->
        <dependency>
          <groupId>com.codingapi</groupId>
          <artifactId>transaction-springcloud</artifactId>
          <version>4.1.2</version>
          <exclusions>
            <exclusion>
              <groupId>org.slf4j</groupId>
              <artifactId>*</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
        <dependency>
          <groupId>com.codingapi</groupId>
          <artifactId>tx-plugins-db</artifactId>
          <version>4.1.2</version>
          <exclusions>
            <exclusion>
              <groupId>org.slf4j</groupId>
              <artifactId>*</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
    
  2. 在订单服务和会员服务工程中都配置applicaiton.yml的LCN信息
     
    tm: 
      manager: 
         url: http://127.0.0.1:8899/tx/manager/
    
  3. 下载demo,地址https://github.com/codingapi/springcloud-lcn-demo
     解压
    将文件中TxManagerHttpRequestServiceImpl.java、TxManagerTxUrlServiceImpl.java复制到你的订单和会员服务service或impl包下
      
  4. 使用@TxTransaction 
     修改订单服务的OrderDataService.java
        @TxTransaction(isStart = true)
        @Transactional
        public int addOrderAndMmeber(OrderDataEntity orderDataEntity, Integer memberId){
            // 更新下单数量
            feignService.updateMember(memberId);
            // 新增下单记录
            int i=10/0;
            return orderDataMapper.addOrder(orderDataEntity);
        }
      
      修改会员服务MemberService.java
        @TxTransaction(isStart = false)
        @Transactional
        public int updateMember(Integer id){
            return memberMapper.updateMember(id);
        }

    isStart=true 表示是发起方   
    isStart=false 表示是参与方
    --因为这里是订单服务调用的会员服务,所以订单服务是发起方,会员服务是参与方
     
  5. 测试
     
     添加报错代码测试 
    @TxTransaction(isStart = true)
        @Transactional
        public int addOrderAndMmeber(OrderDataEntity orderDataEntity, Integer memberId){
            // 订单服务调用会员服务修改数量
            feignService.updateMember(memberId);
            // 订单服务下单
            int i=10/0;
            return orderDataMapper.addOrder(orderDataEntity);
        }
    
    根据上面得到,订单服务、会员服务都会回滚,测试完毕

标签:事务,服务,tx,修改,订单,会员,LCN,分布式
来源: https://blog.csdn.net/xiaobo5264063/article/details/100086111