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);
}