一. 什么是分布式事务
在分布式架构中,一次业务调用,可能横跨多个服务和多个数据库,传统的数据事务无法保证数据的一致性,需要通过分布式事务来解决
二. 分布式事务基础理论
1. CAP定理
- C 一致性
- A 可用性
- P 分区容错性
分布式架构中P一定存在,三者只能满足其二,所以架构要么是AP 可用性, 要么是CP 一致性
2. BASE理论
- BA 核心服务基本可用
- S 可能会出现数据的不一致(软状态)
-
三. 分布式事务的解决方案
XA
- 基于XA接口的两阶段提交方案
- AT
- 改良版的两阶段提交方案
- TCC
- try confirm cancel
- SAGA
- 长事务解决方案 confirm cancel
MQ + 本地消息表
XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
- TCC模式:最终一致的分阶段事务模式,有业务侵入
- AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
- SAGA模式:长事务模式,有业务侵入
1. 如何使用seata
部署seata的服务端(TC 事务协调器)
- 修改配置: registry.conf
- 注册中心
- 让seata将自己的服务信息 注册到nacos中
- 配置中心
- 让seata从nacos中 拉取配置
- 注册中心
- 配置事务数据库
- 全局事务表
- 分支事务表
- 全局锁表
微服务整合seata
- 引入seata的依赖 1.4.2
- 修改微服务的配置 指定从nacos中拉取seata的服务端信息
在事务的发起方法中添加全局事务注解
@GlobalTransactional
3. seata的工作原理
使用前提:
数据库必须是支持事务的关系型数据库
- 必须是java项目,并且用JDBC去访问数据库
@GlobalTransactional
- 标记的方法说明开启了全局事务,seata会为该方法准备一个拦截器
- 当该方法被调用时,拦截器中 会向TC端 注册一个全局事务信息(xid)
- 注册好全局事务后,开始执行每个分支事务:
- 整理流程分为两个阶段
一. 执行每一个分支事务
1. seata为datasource创建了代理对象, 每个服务中操作数据库的方法执行时会创建分支事务
- seata会先解析要执行的sql语句
1. 生成前置镜像
1. 执行SQL
1. 生成后置镜像,将镜像内容存入undolog日志中
1. 分支事务执行完毕
二.根据第一阶段结果,提交 或 回滚
如果所有的分支事务都执行成功,说明全局事务成功,异步的删除undolog日志即可
如果有任何一个环节失败,根据undolog日志进行事务回滚
回滚时:会判断当前数据内容和后置镜像是否一致,一直回滚
不一致, 就一直重试