分布式事务Seata

发布时间:2024年01月10日

目录

1. 事务

1.1 ACID特性

1.2 本地事务和分布式事务

1.3 分布式事务理论依据

1.3.1 CAP定律

1.3.2 BASE理论

?2. Seata

2.1 Seata 基本架构

2.1.1 XA

2.1.2 AT

?2.2 Seata四种模式对比


1. 事务

1.1 ACID特性

  • A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况。

  • C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。例如:张三向李四转100元, 转账前和转账后的数据是正确状态这叫一致性,如果出现张三转出100元,李四账户没有增加100元这就出现了数据错误,就没有达到一致性。

  • I(Isolation):隔离性,数据库中的事务一般都是并发的,隔离性是指并发的两个事务的执行互不干扰,一个事务不能看到其他事务运行过程的中间状态。通过配置事务隔离级别可以避脏读、重复读等问题。

  • D(Durability):持久性,事务完成之后,该事务对数据的更改会被持久化到数据库,且不会被回滚。

1.2 本地事务和分布式事务

本地事务:同一数据库和服务器,称为本地事务。?

分布式事务: 分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,且属于不同的应用,分布式事务需要保证这些操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。

1.3 分布式事务理论依据

1.3.1 CAP定律

在一个分布式系统中、Consistency(一致性)、Availability(可用性)、Partitiontolerance(分区容错性),三者不可得兼。

Consistency(一致性):用户访问分布式系统的任意节点,得到的数据必须一致。

Availability(可用性):用户访问集群中的任意健康节点,必须得到响应,不能超时或者拒绝。

Partitiontolerance(分区容错性):因为网络故障或者其它原因导致分布式系统中的部分节点和其他节点失去连接,形成独立分区。在集群出现分区时,整个系统也要持续对外提供服务。

1.3.2 BASE理论

?2. Seata

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

2.1 Seata 基本架构

  • TC (Transaction Coordinator) - 事务协调者;维护全局和分支事务的状态,驱动全局事务提交或回滚。

  • TM (Transaction Manager) - 事务管理器;定义全局事务的范围:开始全局事务、提交或回滚全局事务。

  • RM (Resource Manager) - 资源管理器;管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

2.1.1 XA

  • Prepare阶段:

    • 在全局事务的提交过程中,Seata协调器会向所有注册的分支事务发起Prepare请求。
    • 各个分支事务执行Prepare,但不会提交事务,而是暂时保持事务的就绪状态。
  • Commit阶段:

    • 如果所有分支事务的Prepare都成功,Seata协调器会向各个分支事务发起Commit请求,分支事务执行实际的事务提交操作。
  • Rollback阶段:

    • 如果任一分支事务的Prepare失败,Seata协调器会向各个分支事务发起Rollback请求,分支事务执行实际的事务回滚操作。

?XA模式代码

公共微服务依赖

       <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

各个微服务bootstrap.yaml中添加:

seata:
  registry:
    type: nacos
    nacos:
      server-addr: localhost:8848
      namespace: ""
      group: DEFAULT_GROUP
      application: seata-server
      username: nacos
      password: nacos
  data-source-proxy-mode: AT

代码示例:

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/test")
    @GlobalTransactional
    public void test(){
        Order order=new Order();
        order.setUsername("张三");
        orderMapper.insert(order);
        Integer in = restTemplate.getForObject("http://mall-goods/test", Integer.class);
        System.out.println(in);
    }

2.1.2 AT

?

?2.2 Seata四种模式对比

文章来源:https://blog.csdn.net/qq_43649937/article/details/135503529
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。