分布式事务是如何产生的?TX- LCN实现分布式事务

Posted 永旗狍子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式事务是如何产生的?TX- LCN实现分布式事务相关的知识,希望对你有一定的参考价值。

目录

分布式事务是如何产生的?

TX- LCN实现分布式事务

 1、搭建事务的协调者

a)导入依赖

 b)在yml中配置信息

 c)在主启动类开启注解

 2、搭建事务的参与者

a)导入依赖

b)在yml中配置      

c)在主启动类上开启注解

d)在业务层添加分布式事务注解


分布式事务是如何产生的?

现有的问题:服务1给服务2和服务3发送消息,服务2和服务3都要去操作自己的MySQL数据库,然而服务3出现了异常,怎么解决?

以上的分析已经非常明显了,一般的事务解决不了。下面看一下分布式事务是如何解决的:

TX- LCN实现分布式事务

基于三段提交和TCC实现的

TX-LCN分布式事务框架,LCN并不生产事务,LCN只是本地事务的协调工,LCN是一个高性能的分布式事务框架,兼容dubbo、springcloud框架,支持RPC框架拓展,支持各种ORM框架、NoSQL、负载均衡、事务补偿.

1、一致性,通过TxManager协调控制与事务补偿机制确保数据一致性

2、易用性,仅需要在业务方法上添加@TxTransaction注解即可

3、高可用,项目模块不仅可高可用部署,事务协调器也可集群化部署

4、扩展性,支持各种RPC框架扩展,支持通讯协议与事务模式扩展

 文档地址:https://www.codingapi.com/docs/txlcn-setting-manager/

 1、搭建事务的协调者

a)导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency>
    <groupId>com.codingapi.txlcn</groupId>
    <artifactId>txlcn-tm</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>

 b)在yml中配置信息

        a)数据库一定要写hikari下面

server:
  port: 8888
spring:
  datasource:
    hikari:
      username: root
      password: 123
      driver-class-name: com.mysql.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/tx-manager
    url: jdbc:mysql://localhost:3306/tx-manager
  jpa:
    hibernate:
      use-new-id-generator-mappings: false
  redis:
    host: 1111.com
tx-lcn:
  manager:
    port: 8070

 c)在主启动类开启注解

@EnableTransactionManagerServer

 2、搭建事务的参与者

a)导入依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.2</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</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>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

b)在yml中配置      

          a)连接事务的参与者

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/shop-order-1
    username: root
    password: 123
    driver-class-name: com.mysql.jdbc.Driver
server:
  port: 8081
tx-lcn:
  client:
    manager-address: localhost:8070


spring:
  datasource:
    url: jdbc:mysql://localhost:3306/shop-order-2
    username: root
    password: 123
    driver-class-name: com.mysql.jdbc.Driver
server:
  port: 8092
tx-lcn:
  client:
    manager-address: localhost:8070

c)在主启动类上开启注解

@EnableDistributedTransaction

d)在业务层添加分布式事务注解

    @Transactional
    @LcnTransaction  // 分布式事务
@Service
public class ServerServiceImpl 
    @Autowired
    private ServerMapper serverMapper;
    @Autowired
    private RestTemplate restTemplate;

    @Transactional
    @LcnTransaction  // 分布式事务
    public void add() 

        // 1.先给shop-order-1中插入一条记录
        serverMapper.add("server-1");
        System.out.println("插入server-1成功");

        // 模拟在调用过从中出现异常
//        int i = 10 / 0;

        // 2.调用server2再给shop-order-2中插入一条记录
        String forObject = restTemplate.getForObject("http://localhost:8092/server2/add", String.class);
        System.out.println("插入server-2成功,返回值:" + forObject);
    

以上是关于分布式事务是如何产生的?TX- LCN实现分布式事务的主要内容,如果未能解决你的问题,请参考以下文章

分布式事务是如何产生的?TX- LCN实现分布式事务

分布式事务是如何产生的?TX- LCN实现分布式事务

TX-LCN:分布式事务框架

TX-LCN:分布式事务框架

分布式事务-Tx-lcn

浅谈分布式事务与TX-LCN