初识Spring Cloud系列——Seata原理

314 阅读4分钟

这是我参与更文挑战的第26天,活动详情查看: 更文挑战

前言

从 CPU 到内存、到磁盘、到操作系统、到网络,计算机系统处处存在不可靠因素。记得以前上司说过一句话,机器跟程序都是不可靠的,只要有可能发生的事情,那么我们就要把这件事当作百分百会发生,而我们的目的则是为了预防这些不可靠因素,来保证数据和指令被正确地处理

小故事

一天,小明去搭地铁,发现地铁卡没钱了,就去机器充值,刚扫付款码支付,小明的钱扣了,机器正在充值中,这时候机器突然故障了,那么小明卡里的钱没了,卡也没有充值上,由于手机和充值机器属于两个隔离的系统,手机不知道系统故障了,或者说充值机器故障的消息没法告诉手机,这个时候,就需要有个第三方服务,将手机付款,机器充值的事情记录起来,过一段时间后,小明虽然充值失败了,但支付的钱应该退回给他了

分布式事物处理过程

组成

  • Transaction ID XID 全局唯一的事务ID
  • 三组件概念

三组件概念

  • TC (Transaction Coordinator):事务协调者,维护全局和分支事务的状态,驱动全局事务提交或回滚。
  • TM (Transaction Manager):事务管理器,定义全局事务的范围:开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager):资源管理器,管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

什么是Seata?

Seata:简单可扩展自治事务框架,提供全方位分布式事务解决方案

Seata有四种模式:

AT模式

一阶段

在一个数据库食物内完成,保证操作的原子性:

  • 业务数据更新之前,Seata解析SQL并获取SQL要更新的数据保存为“before image”
  • 业务数据更新之后,Seata解析SQL并获取SQL要更新的数据保存为“after image”
二阶段
  • 二阶段提交,证明业务数据已经提交到数据库成功,那么Seata框架将一阶段保存的快照数据和行锁删除,完成数据清理
  • 二阶段回滚,Seata需要回滚到一阶段的“before image数据”,回滚前先根据“after image”对比数据库的业务数据是否一致,不一致则证明有脏写,出现这种情况则需要人工处理

TCC

TCC分为三个阶段:

  • Try:做业务检查和资源预留
  • Confirm:确认提交
  • Cancel:业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放

Sage

Sage 是长事务解决方案,事务驱动 saga提供了两种实现方式,一种是编排,另一种是控制。seata的实现方式是后者。seata的控制器使用状态机驱动事务执行。

  • 在saga模式下,seata提供了RM、TM和TC三个角色。
  • TC也是位于sever端,RM和TM位于客户端。
  • TM用于开启全局事务,RM开启分支事务,TC监控事务运行。

XA 模式

在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种 事务模式。

执行阶段:

  • 可回滚:业务 SQL 操作放在 XA 分支中进行,由资源对 XA 协议的支持来保证 可回滚
  • 持久化:XA 分支完成后,执行 XA prepare,同样,由资源对 XA 协议的支持来保证 持久化(即,之后任何意外都不会造成无法回滚的情况)

完成阶段:

  • 分支提交:执行 XA 分支的 commit
  • 分支回滚:执行 XA 分支的 rollback

今日小结

Seata是一款开源的分布式事务解决方案,对于分布式事物,小编了解还不足,今天就先学一部分了,还待完善。