分布式事务
回顾事务
什么是事务 ?
- 一组对数据库的操作,整体要么一起成功,要么一起失败
事务的特性?
- 一致性
- 原子性
在项目中做事务控制 ? 怎么做 ?
- 在启动类上加@EnableTransactonManager
- 事务加在service层,加在实现类上或者接口上,都可以@transactional
分布式事务背景
CAP : 分布式系统定理
C:一致性 +A: 可用性 + P:分区性
- 单独理解三个指标含义
- 三个指标只能选择两个
- p是一定要考虑的,分区是不可避免的
- CP: 大家一起提交,一起失败,必须完全一致
- AP: 最终一致即可(eg:服务器宕机了,但是仍然可以执行,服务器恢复后重新执行。。)
全局事务 : 整个分布式事务
分支事务 : 事务参与者 (子事务)
Seata架构(事务管理)
阿里开源的,解决分布式事务的,有三个主要概念,见下
- TC :事务协调者 决策者 安装seata
- TM : 事务管理器 全局事务 (微服务相关)
- RM : 资源管理器 事务参与者 (微服务相关)
seata提供的四种分布式事务解决方案
-
XA : 把整个事务分成两阶段提交 : 第一阶段准备(本地事务不提交),第二阶段提交或者回滚(看返回的结果,大家是否都是OK),
- 缺点 : 完全依赖与数据库事务控制,第一阶段不提交,会锁定数据库资源,造成阻塞,性能差
- 特点 : 强一致
- 在JAVA中部署的步骤:
-
TCC
-
AT : 解决 XA 模式的缺点,仍是两阶段提交(2PC )
- 注册分支事务,准备阶段时,执行sql后,直接提交本地事务(无法依赖数据库事务回滚或者提交),报告当前状态给事务协调者TC
- 记录更新前后快照 (数据),存入undo_ log日志表中
- 回滚或者提交 (完成后都要删除undo_log)
- 最终一致
- 注册分支事务,准备阶段时,执行sql后,直接提交本地事务(无法依赖数据库事务回滚或者提交),报告当前状态给事务协调者TC
-
SAGA