最近在写一本关于阿里巴巴分布式事务中间件Seata的电子书。Seata可以说是最完善的分布式事务中间件,包括AT、TCC、Saga、XA四种模式,目前Seata已经更新到1.4.2版本。本电子书主要分为两部分。第一部分是入门学习,已经更新了。第二部分是源码解读。Seata的源码写的很好,值得一读。全书当前目录结构如下:欢迎喜欢的朋友下载学习。获取方式:关注公众号,后台回复:Seata。下面简单介绍一下Seata的四种模式。AT模式AT模式指的是单一数据库的事务原则。我们可以把一个分布式事务中的每个数据库看成是单个数据库的一张表。首先,每个事务都有一个名为xid的全局事务ID。有了这个xid,我们就可以记录undo_log了,undo_log中记录了这个xid对应的回滚数据。每个事务提交之前,必须先写入undo_log,然后再提交事务。这里指的是mysql中的WAL机制。rollback_info字段记录了要回滚的表的记录中的各个字段和对应的值,方便回滚。AT模式下的两阶段提交如下:第一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。Phase2:异步提交,完成的非常快。rollback通过单级回滚日志进行反向补偿。AT模式读写有隔离,这里简单介绍一下。在写入隔离的第一阶段提交本地事务之前,您需要确保首先获得**全局锁*。没有全局锁,本地事务无法提交。获取全局锁的尝试将有超时限制。如果超过限制,则放弃并回滚本地事务以释放本地锁。以上是官网上的说明,非常通俗易懂。如果获取不到全局锁,则无法提交本地事务,只能等待超时获取全局锁。读隔离AT模式的读隔离要求本地事务隔离级别为readcommitted或以上,AT模式默认的全局隔离级别为readuncommitted。如果应用在特定场景下使用,则必须要求全局读提交,需要通过SELECTFORUPDATE语句的代理来实现Seata。SELECTFORUPDATE语句的执行会申请一个全局锁。如果全局锁被其他事务持有,则释放局部锁并重试。在此过程中,查询被阻塞,直到获得全局锁。简单来说,TCC模式就是把整个交易分成两个阶段提交。try阶段预留资源。如果所有分支都保留成功,则进入commit阶段提交所有分支事务,否则执行cancel取消所有分支事务。.以电商系统为例,如果有订单、库存、账户三个服务,客户购买一件商品,订单服务增加订单,库存服务扣除库存,账户服务扣除金额。这三个操作必须是原子的,要么全部成功,要么全部失败。try阶段如下图所示:订单服务添加订单,库存服务冻结订单上的库存,账户服务冻结订单上的金额。在此阶段,数据进入中间状态。commit阶段如下图所示:在commit阶段,数据从中间状态转移到最终状态,例如订单金额从中间账户转移到最终账户。cancel阶段和commit阶段类似,比如订单金额从中间账户返回到客户账户。Saga模式Saga模式适用于长流程的业务场景,使用状态机来控制整个事务的执行。它使用状态图定义服务调用流程,生成Json状态语言定义文件。状态图的节点可以是服务节点,也可以是补偿节点。下图定义了电子商务系统的业务流程。根据这个流程图,可以定义Json文件供状态机使用。XA模式XA模式要求分支事务数据库支持XA原语。看一下官方图:XA模式的两阶段提交与TCC模式的两阶段提交类似。全局事务由TM启动,RM向TC注册分支事务并上报分支事务状态,TC根据全局事务的状态提交或回滚分支事务。在代码实现上,XA模式是使用数据源代理实现的。与TCC模式不同的是,XA模式只需要有一个prepare方法即可。Seata通过结合Start|优化了XA数据库|准备成一个阶段。这支持MySQL数据库,但不支持Oracle数据库。
