分布式事务是如何产生的?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);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值