分布式事务Seata

目录

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: XA

代码示例:

    @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四种模式对比

  • 27
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河亦问安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值