分布式事务与Seata

2019-11-20  本文已影响0人  无醉_1866

分布式事务DTP模型

DTP模型是Distributed Transaction Processing的缩写,DTP是一套分布式事务的规范,不同的厂商针对此规范提供实现。DTP中包含AP、RM、TM三个角色,其中:

它们之间的关系如下:

image

在DTP模型中,AP操作RM完成事务中的数据操作,比如数据库的更新等,在这些操作结束后,AP通过TX接口向TM发起提交事务或者回滚事务,TM通过XA协议向RMs提交或者回滚事务,XA通过两阶段提交的方式完成事务的提交或回滚。

DTP和XA的缺点:

两阶段提交(2PC)

前面说过XA协议通过两阶段提交的方式做事务的提交或回滚,两阶段提交,即将事务的提交分为两个阶段:

两阶段提交的示意图可表示如下:

image

如果有RM的prepare阶段失败,则需要回滚,示意图如下:

image

2PC的缺点:

Seata对分布式事务的支持

image

这里先介绍三个概念:

Seata借鉴了DTP模型中的概念,并且自定义了TC(Transaction Coordinator)角色,实际上是将事务的协调者从TM中分享出来并独立部署,TC负责全局事务的提交和回滚,并对分支事务做补偿,使得即使事务提交过程各,部分分支事务成功部分失败,也能达到最终一致

Seata支持的分布式事务的模式

AT模式

AT模式是建立在数据库的ACID事务的基础上的,它提供的两阶段提交是对XA的两阶段提交的演进,效率上比XA好,但是整体开销还是偏大。AT模式的基础原理是在每个分支事务的数据库中记录事务的回滚日志,seata对事务的处理过程如下:

当事务需要回滚时,每个分支事务的DB中有redo log,RM通过redo log执行事务的回滚,但回滚时需要对数据进行判断,如果当前数据与redo log中的兵团镜像相同,则回滚,否则表示数据被事务外的操作修改了,需要根据配置策略做处理。AT模式下的两阶段提交行为如下:

TCC模式

Seata支持TCC模式,TCC模式也是基于两阶段提交的,与AT模式不同的是,TCC不依赖数据库的ACID特性,而是依赖应用自定义的一阶段的prepare行为和二阶段的commit/rollback行为,TCC模式将事务从数据库层面提升到了应用服务层面。

在TCC模式中,分支事务需要实现prepare、commit和rollback三个方法,其示意图如下:

image

总体过程比较清晰:

TCC模式下,两阶段行为如下:

Saga模式

Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

说简单点,就是第一阶段,每个分支事务先自己提交,当需要回滚的时候,分支事务提供一个回滚的入口,对事务做逆向过程:

image

Saga模式有一定的优势:

AT、TCC、Saga三种模式的比较

AT、TCC、Saga三种模式,是在性能、改造成本、隔离性三者之间做权衡和取舍,AT选择了隔离性和低改造成本,TCC选择了性能和隔离性,Saga选择了性能和低改造成本,如下图所示:

image

基于事务消息的分布式事务方案

还可选择使用RocketMQ的事务消息来实现分布式事务。

优点:

同样有缺点和限制:

如果采用事务消息实现分布式事务,需要有其它方案规避其缺点,这里不做描述。

上一篇 下一篇

猜你喜欢

热点阅读