分布式事务Seata(别名Seta)(持续学习中)

2023-12-13 21:01:05

1.为什么学习他? 当一台机器的时候,只需要本地事务回滚就好了,还有MonogoDB最好不要放敏感数据,特别是旧的版本,没有事务功能(ACID),
分布式事务,也是属于多线程问题,就是把多台机器变成一台机器(他拥有更多线程,但是也要考虑网络问题),redis在一台机器是单线程的,但是多台机器又回到了多线程问题…(CAP和BASE最终一致性理论)

2.行内对分布式事务的解决方案-----二段式提交

1.第一阶段 请求执行(写入 undo redo日志)
2. 第二阶段 提交 真正执行(各个机器 undo状态一致了就提交事务,部分redo就回滚)

3.二段式提交导致的问题

1.阻塞,一个事务 一致被占用导致其他事务阻塞(占着茅坑不拉屎)
2.数据不一致,所有事务都确认undo了,由于网络波动,部分事务请求执行不了
3.协调者没有高可用,被选举的协调者(没有从机高可用)宕机导致全部事务阻塞

4.什么是Seta(解决分布式事务) 图片的主要意思就是其他角色向TC注册得到XID保证事务唯一性

请添加图片描述
请添加图片描述

5.不同的解决方案 业务入侵(后期需要插入事务的代码) 无入侵(自动管理事务)

Seata提供了四种不同的分布式事务解决方案:

XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入 TCC模式:最终一致的分阶段事务模式,有业务侵入
AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
SAGA模式:长事务模式,有业务侵入

6.比较 性能好的要手动编写更多代码
在这里插入图片描述

7.操作
1.下载控制台,启动seata
https://seata.io/zh-cn/
2.mysql创建表
3.maven导入依赖

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.4.2</version>
</dependency>

//或者不整合springboot的
    <dependencies>
    <!-- 其他依赖 -->
    <dependency>
        <groupId>io.seata</groupId>
        <artifactId>seata-core</artifactId>
        <version>1.4.0</version>
    </dependency>
    <!-- 其他依赖 -->
</dependencies>

4.写配置文件
# Seata 配置
seata.tx-service-group=my_test_tx_group
seata.enable-auto-data-source-proxy=true
seata.enable-auto-configuration=true
seata.config.nacos.server-addr=127.0.0.1:8848
seata.config.nacos.namespace=seata
seata.config.nacos.group=SEATA_GROUP

# 事务存储配置
spring.datasource.seata.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.seata.url=jdbc:mysql://localhost:3306/seata
spring.datasource.seata.username=root
spring.datasource.seata.password=123456



5.使用在service业务写注解

@Compensable
@Transactional
@Override
public void createOrder(Order order) {
    // 扣减账户余额
    accountService.decreaseBalance(order.getUserId(), order.getAmount());
    // 创建订单
    orderMapper.insert(order);
}

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