zoukankan      html  css  js  c++  java
  • LCN事务模式

    TX-LCN由两大模块组成, TxClient、TxManager,TxClient作为模块的依赖框架,提供TX-LCN的标准支持,TxManager作为分布式事务的控制放。事务发起方或者参与反都由TxClient端来控制。

    原理介绍

    LCN模式是通过代理Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。

    模式特点

    • 该模式对代码的嵌入性为低。
    • 该模式仅限于本地存在连接对象且可通过连接对象控制事务的模块。
    • 该模式下的事务提交与回滚是由本地事务方控制,对于数据一致性上有较高的保障。
    • 该模式缺陷在于代理的连接需要随事务发起方一共释放连接,增加了连接占用的时间。

    原理图

    LCN

    中文文档

    • Lock:锁定事务单元
    • Confirm:确认事务
    • Notify:通知事务

    协调机制的本质:代理了DataSource的机制,保持了请求和db连接的对应。

    TM将commit信息通知不到对应的RM,补偿机制:做标识、做记录(通知的具体事项,或者需要执行sql的操作)

    TM

    协调器,没有业务类

    pom.xml

    <!--tm-->
    <!-- tm  manager -->
    <dependency>
        <groupId>com.codingapi.txlcn</groupId>
        <artifactId>txlcn-tm</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    
    <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.properties

    # TM事务管理器的服务端WEB访问端口。提供一个可视化的界面。端口自定义。
    server.port=7970
    
    # TM事务管理器,需要访问数据库,实现分布式事务状态记录。
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://192.168.1.113:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    spring.datasource.username=root
    spring.datasource.password=123456
    
    # TM事务管理器,是依赖Redis使用分布式事务协调的。尤其是TCC和TXC两种事务模型。
    spring.redis.host=192.168.1.113
    spring.redis.port=6379
    spring.redis.database=0
    spring.redis.password=123456
    # 为spring应用起名。
    spring.application.name=tx-lcn-transaction-manager
    
    # TM事务管理器,提供的WEB管理平台的登录密码。无用户名。 默认是codingapi
    tx-lcn.manager.admin-key=dandan
    # 日志。如果需要TM记录日志。则开启,赋值为true,并提供后续的配置。
    tx-lcn.logger.enabled=true
    
    # 为日志功能,提供数据库连接。和之前配置的分布式事务管理依赖使用的数据源不同。
    tx-lcn.logger.driver-class-name=com.mysql.cj.jdbc.Driver
    tx-lcn.logger.jdbc-url=jdbc:mysql://192.168.1.113:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    tx-lcn.logger.username=root
    tx-lcn.logger.password=123456
    

    启动类

    package com.dandan.lcntm;
    
    import com.codingapi.txlcn.tm.config.EnableTransactionManagerServer;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @EnableTransactionManagerServer
    public class LcnTmApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(LcnTmApplication.class, args);
        }
    
    }
    

    TC

    pom.xml

    <!-- lcn -->
    <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

    server:
      port: 1002
    
    spring:
      application:
        name: lcn-pay
    
    
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.1.113:3306/lcn-pay?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
        dbcp2:
          initial-size: 5
          min-idle: 5
          max-total: 5
          max-wait-millis: 200
          validation-query: SELECT 1
          test-while-idle: true
          test-on-borrow: false
          test-on-return: false
    
    mybatis:
      mapper-locations:
        - classpath:mapper/*.xml
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7900/eureka/
    
    tx-lcn:
      client:
        manager-address: 127.0.0.1:8070 #TM地址
    
    

    启动类

    package com.dandan.lcnpay;
    
    import com.codingapi.txlcn.tc.config.EnableDistributedTransaction;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @EnableDistributedTransaction
    public class LcnPayApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(LcnPayApplication.class, args);
        }
    }
    

    业务类

    package com.dandan.lcnorder.controller;
    
    import com.codingapi.txlcn.tc.annotation.LcnTransaction;
    import com.dandan.lcnorder.dao.TblOrderDao;
    import com.dandan.lcnorder.entity.TblOrder;
    import net.sf.json.JSONObject;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class OrderController {
        @Autowired
        private TblOrderDao tblOrderDao;
    
        @Autowired
        private RestTemplate restTemplate;
    
        @PostMapping("/add-order")
        @Transactional(rollbackFor = Exception.class)
        @LcnTransaction
        public String add(@RequestBody TblOrder bean){
    
            JSONObject date = new JSONObject();
            date.put("payName",bean.getOrderName()+"pay");
    
            restTemplate.postForEntity("http://lcn-pay/add-pay",date,String.class);
            int i = 1/0;
            tblOrderDao.insert(bean);
            return "新增订单成功";
        }
    }
    

    集群

    TM端

    # lcn-TM1
    server.port=7971
    
    # lcn-TM2
    server.port=7972
    

    client端

    tx-lcn:
      client:
        manager-address: 127.0.0.1:8071,127.0.0.1:8072
    

    参考文档

    使用场景

    • 全部都是sql操作,带本地事务的,比如mysql,使用LCN事务
    • 都是一些没有事务的中间件操作,比如redis,使用TCC事务
  • 相关阅读:
    图像滤镜艺术---乐高像素拼图特效滤镜的代码实现
    假设你也23
    seajs载入流程图
    android 怎样将主菜单图标改成按安装时间排序
    热力学第一定律的社会学思考
    Django创建数据表
    KeyPress 和KeyDown 、KeyPress之间的区别
    Delphi 制作自定义数据感知控件并装入包(dpk文件)中(与DBText类似的数据感知控件)
    Delphi中的窗体创建与销毁
    Delphi ADOQuery连接数据库的查询、插入、删除、修改
  • 原文地址:https://www.cnblogs.com/zheaven/p/15543022.html
Copyright © 2011-2022 走看看