Lcn分布式事务

搭建事务协调者tx-Manager
创建tx-manager工程,并引入lcn的依赖
<dependencies>
        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-tm</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
</dependencies>
创建application.properties空文件和application.yml文件
server:
  port: 50000
spring:
  datasource:
    username: root
    password: 123
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///tx-manager?characterEncoding=utf8&serverTimezone=Asia/Shanghai
  redis:
    host: 192.168.206.142
    port: 6379
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      ddl-auto: update
tx-lcn:
  manager:
    port: 9527
启动类加注解
@SpringBootApplication
@EnableTransactionManagerServer
public class TxManagerApplication {

    public static void main(String[] args){
        SpringApplication.run(TxManagerApplication.class,args);
    }
}
订单和仓储服务实现分布式事务
订单服务要引入的依赖
<dependency>
     <groupId>com.codingapi.txlcn</groupId>
     <artifactId>txlcn-tc</artifactId>
     <version>5.0.2.RELEASE</version>
 </dependency>

<dependency>
    <groupId>com.codingapi.txlcn</groupId>
    <artifactId>txlcn-txmsg-netty</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>
application.yml文件新增配置
tx-lcn:
  client:
    manager-address: localhost:9527
启动类加注解 @EnableDistributedTransaction
service实现类的操作方法上添加@LcnTransaction注解
@Transactional
    @LcnTransaction
    @Override
    public int updateStatus(PopOrderData pojo, String exp) {
        int i = popOrderDataMapper.updateByPrimaryKeySelective(pojo);
        Long id = pojo.getId();
        PopOrderData popOrderData = popOrderDataMapper.selectByPrimaryKey(id);
        Long orderId = popOrderData.getOrderId();
        PopOrderItemExample example = new PopOrderItemExample();
        PopOrderItemExample.Criteria criteria = example.createCriteria();
        criteria.andOrderIdEqualTo(orderId);
        List<PopOrderItem> popOrderItems = popOrderItemMapper.selectByExample(example);
        PopOrderItem popOrderItem = popOrderItems.get(0);
        Long skuId = popOrderItem.getSkuId();
        //更新仓库
        int updateProduct = houseFeignClient.updateProduct(skuId, 1);
        if("1".equals(exp)) {
            //人为制造异常
            int v = 100 / 0;
        }
        return i+updateProduct;
    }
仓储服务
<dependency>
     <groupId>com.codingapi.txlcn</groupId>
     <artifactId>txlcn-tc</artifactId>
     <version>5.0.2.RELEASE</version>
 </dependency>

<dependency>
    <groupId>com.codingapi.txlcn</groupId>
    <artifactId>txlcn-txmsg-netty</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>
application.yml文件新增配置
tx-lcn:
  client:
    manager-address: localhost:9527
启动类加注解 @EnableDistributedTransaction
service实现类的操作方法上添加@LcnTransaction注解
    @Transactional //让spring来控制这个本地事务,防止出现异常的时候不回滚
    @LcnTransaction(propagation = DTXPropagation.SUPPORTS)//使用LCN进行事务的管理,
    // 表示当前方法中没有事务,如果其他方法(有事务)中调用到了当前方法,那当前方法就加入事务。
    public int updateHouse(Long skuId, int cnt) {
        WarehouseProductExample example = new WarehouseProductExample();
        WarehouseProductExample.Criteria criteria = example.createCriteria();
        criteria.andProductIdEqualTo(skuId.intValue());
        List<WarehouseProduct> warehouseProducts = warehouseProductMapper.selectByExample(example);
        WarehouseProduct warehouseProduct = warehouseProducts.get(0);
        warehouseProduct.setCurrentCnt(warehouseProduct.getCurrentCnt()+cnt);
        int i = warehouseProductMapper.updateByPrimaryKeySelective(warehouseProduct);
        return i;
    }

gitee地址:

https://gitee.com/fengyabin/springcloud-2009-openapi.git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值