分布式事务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四种模式对比


相关文章
|
1月前
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
|
2月前
|
关系型数据库 MySQL 数据库
分布式事务Seata
分布式事务Seata
|
2月前
|
Java 数据库连接 API
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)
60 0
|
2月前
|
存储 Oracle 关系型数据库
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)
45 0
|
1天前
|
SQL 存储 运维
分布式事务Seata实践(上)
分布式事务Seata实践
5 0
|
26天前
|
SQL 数据库 Windows
SpringCloud集成seata分布式事务控制
SpringCloud集成seata分布式事务控制
16 0
|
1月前
|
SQL SpringCloudAlibaba 中间件
SpringCloud Alibaba Seata处理分布式事务--学习笔记
SpringCloud Alibaba Seata处理分布式事务--学习笔记
26 0
|
1月前
|
NoSQL 算法 安全
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
155 0
|
1月前
|
NoSQL 关系型数据库 MySQL
分布式锁(redis/mysql)
分布式锁(redis/mysql)
61 1
|
1月前
|
NoSQL Java Redis
如何通俗易懂的理解Redis分布式锁
在多线程并发的情况下,我们如何保证一个代码块在同一时间只能由一个线程访问呢?
39 2