分布式事务Seata

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

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


相关文章
|
3月前
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
4月前
|
关系型数据库 MySQL 数据库
SpringCloud2023中使用Seata解决分布式事务
对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数据的操作要么一起成功,要么一起失败,必须是一个整体性的事务。Seata简化了这个使用过程。
91 2
|
4月前
|
Java 关系型数据库 MySQL
(二十七)舞动手指速写一个Seata-XA框架解决棘手的分布式事务问题
相信大家对于事务问题都不陌生,在之前《MySQL事务篇》中曾详解过MySQL的事务机制,在传统的单库环境下开发,咱们可依赖于MySQL所提供的事务机制,来确保单个事务内的一组操作,要么全部执行成功,要么全部执行失败。
|
4月前
|
Java Nacos Docker
"揭秘!Docker部署Seata遇上Nacos,注册成功却报错?这些坑你不得不防!一网打尽解决秘籍,让你的分布式事务稳如老狗!"
【8月更文挑战第15天】在微服务架构中,Nacos搭配Seata确保数据一致性时,Docker部署Seata后可能出现客户端连接错误,如“can not connect to services-server”。此问题多由网络配置不当、配置文件错误或版本不兼容引起。解决策略包括:调整Docker网络设置确保可达性;检查并修正`file.conf`和`registry.conf`中的Nacos地址和端口;验证Seata与Nacos版本兼容性;修改配置后重启服务;参考官方文档和最佳实践进行配置。通过这些步骤,能有效排除故障,保障服务稳定运行。
290 0
|
6月前
|
Java 数据库 开发者
深入解析 Spring Cloud Seata:分布式事务的全面指南
深入解析 Spring Cloud Seata:分布式事务的全面指南
322 1
|
6月前
|
存储 关系型数据库 Java
技术经验解读:三种分布式事务LCN、Seata、MQ
技术经验解读:三种分布式事务LCN、Seata、MQ
196 0
|
6月前
|
消息中间件 SQL 关系型数据库
分布式事务-seata
分布式事务-seata
177 0
|
6月前
|
SQL 数据库
Seata:分布式事务
Seata:分布式事务
189 0
|
7月前
|
Nacos 数据库
分布式事务解决方案Seata
分布式事务解决方案Seata
99 1
|
7月前
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏