Springboot2.5集成LCN 5.0.2分布式事务

  1. 下载LCN包

参考:https://blog.csdn.net/jiayoubing/article/details/105316029

Springboot2.5集成LCN 5.0.2分布式事务_第1张图片

  1. 在eclipse中导入pom文件

Springboot2.5集成LCN 5.0.2分布式事务_第2张图片

  1. 配置数据库和redis

a.在txlcn-tm工程resources目录下找到tx-manager.sql,在mysql中之心sql文件建表

Springboot2.5集成LCN 5.0.2分布式事务_第3张图片

b.修改application.properties文件中的datasource连接信息

c.在application.properties文件中增加redis服务器信息(新增加,下载的压缩包里面是没有redis信息的)

修改后的application.properties文件信息如下:

spring.application.name=TransactionManager
server.port=7970
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.234.135:3306/tx-manager?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=jiayoubing
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
#Redis
spring.redis.host=192.168.234.157
spring.redis.port=6379
spring.redis.password=

 

启动TXManage

TMApplication.java

访问:http://localhost:7970

TM后台登陆密码,默认值为codingapi

在已注册TC里面可以看到启动的TC。

 

Springboot2.5集成LCN 5.0.2分布式事务_第4张图片

 

我们以订单和库存为例,来演示如何使用TX-LCN

1)修改POM文件 


        com.codingapi.txlcn
        txlcn-tc
        5.0.2.RELEASE
    
 
    
        com.codingapi.txlcn
        txlcn-txmsg-netty
        5.0.2.RELEASE
    

 

2)修改application.yml配置

#lcn配置
tx-lcn: 
  client: 
    manager-address: 127.0.0.1:8070
  springcloud:
    loadbalance:
      enabled: true

微服务集群且用到 LCN事务模式时,为保证性能请开启TX-LCN重写的负载策略。

3)修改启动类 增加@EnableDistributedTransaction

@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
@MapperScan(basePackages = "com.infosys.china.order.mapper")
//开启分布式事务
@EnableDistributedTransaction
public class AppOrder
{
    public static void main(String[] args)
    {
        SpringApplication.run(AppOrder.class, args);
    }
}

4)修改业务类 

增加2个注解@Transactional

@LcnTransaction(propagation = DTXPropagation.REQUIRED) //分布式事务注解,发起方使用REQUIRED,事物参与方使用SUPPORTS

 @LcnTransaction(propagation = DTXPropagation.REQUIRED) //分布式事务注解,发起方使用REQUIRED,事物参与方使用SUPPORTS
    @Transactional //本地事务注解
    @GetMapping(value = "/addOrderAndStock")
    public BaseResponse addOrderAndStock throws Exception
    {
        OrderEntity orderEntity = new OrderEntity();
        orderEntity.setName("华为在线课堂会员");
        orderEntity.setOrderCreatetime(new Date());
        // 价格是300元
        orderEntity.setOrderMoney(300d);
        // 状态为 未支付
        orderEntity.setOrderState(0);
        Long commodityId = 30l;
        // 商品id
        orderEntity.setCommodityId(commodityId);
        // 1.先下单,创建订单
        int orderResult = orderMapper.addOrder(orderEntity);
        System.out.println("orderResult:" + orderResult);
        if (orderResult <= 0)
        {
            return setResultError("下单失败!");
        }

        // 2.下单成功后,调用库存服务
        BaseResponse inventoryReduction = stockFeign.inventoryReduction(commodityId);
        if (inventoryReduction.getCode() != 200)
        {
            throw new Exception("调用库存服务接口失败,开始回退订单事务代码");
        }

        return setResultSuccess("下单成功!");
    }

6)配置事物参与方

@LcnTransaction(propagation = DTXPropagation.SUPPORTS) // 分布式事务注解,发起方使用REQUIRED,事物参与方使用SUPPORTS
    @Transactional // 本地事务注解
    @RequestMapping("/inventoryReduction")
    public BaseResponse inventoryReduction(@RequestParam("commodityId") Long commodityId)
    {
        if (commodityId == null)
        {
            return setResultError("商品id不能为空!");
        }
        // 1.查询该商品id 是否存在
        StockEntity stockEntity = stockMapper.selectStock(commodityId);
        if (stockEntity == null)
        {
            return setResultError("商品id不存在!");
        }
        // 2.判断商品是否有超卖
        if (stockEntity.getStock() <= 0)
        {
            return setResultError("当前商品已经买完啦!");
        }
        // 3.减去库存1
        int updateStockResult = stockMapper.updateStock(commodityId);
        if (updateStockResult <= 0)
        {
            return setResultError("修改库存失败!");
        }
        return setResultSuccess("修改库存成功!");
    }

启动发起服务和参与服务后,进入到TXManager后台

Springboot2.5集成LCN 5.0.2分布式事务_第5张图片

恭喜你!LCN分布式事务管理已经部署进去啦!

你可能感兴趣的:(Springboot2.5集成LCN 5.0.2分布式事务)