0
点赞
收藏
分享

微信扫一扫

分布式事务理解

悲催博士僧 2021-09-21 阅读 48

1.事务的概念


事务,其实是包含一系列操作的、一个有边界的工作序列,有明确的开始和结束标志,且要么被完全执行, 要么完全失败,即all or nothing。通常情况下,我们所说的事务指的都是本地事务,也就是在单机上的事 务。

2.本地事务



本地事务四大特性(ACID):

3.分布式事务



分布式事务的实现主要有以下 5 种方案:

xa方案

1.XA规范

X/Open组织(现在的Open Group)定义了一套DTP(Distributed Transaction Processing)分布式事务处理模型,主要包含以下四部分:

XA规范则是DTP模型定义TM和RM之间通讯的接口规范。XA接口函数由数据库厂商提供。TM用它来通知数据库事务的开始、结束、提交、回滚。基于XA规范衍生出下面的二阶段提交(2PC)、三阶段提交(3PC)。

XA规范包括两套函数,以xa_开头的及以ax_开头的。
以下的函数使事务管理器可以对资源管理器进行的操作:

XA的一些问题:

2.JTA(Java Transaction API)

即Java的事务API,基于XA实现,也就是RM需要支持XA,所以也有JTA(XA)的说法,JTA仅定义了接口。主要包括javax.sql.XADataResource、javax.sql.XAConnection、javax.sql.XAException、javax.transaction.xa.XAResource、javax.transaction.Xid。
目下JTA的实现有几种形式:

3.二阶段提交2PC

2PC就是分布式事务中将事务分为两步进行提交。基于数据库的XA协议完成事务本质上就是二阶段提交(XA、JTA/JTS)。

二阶段提交的一些问题:

实践demohttps://github.com/cderlearner/xa-demo

4.三阶段提交3PC

相比于2PC,3PC把2PC的准备阶段再次进行拆分,并且3PC引入了参与者超时机制。

事务补偿型方案tcc

TCC的核心思想就是校验、资源锁定、补偿,对每个操作(Try)都提供确认(Confirm)和取消(cancel)的操作,这样根据操作的结果,来确认是进行Confirm还是Cancel。
可以看出XA的两阶段提交是基于资源层面的,而TCC也是一种两阶段提交,但它是基于应用层面的。

TCC存在的一些问题:

常见的微服务系统大部分接口调用是同步的,这时候使用TCC来保证一致性是比较合适的。

实践demo:TODO

本地消息表

本地消息表其实是国外的 ebay 搞出来的这么一套思想。

这个大概意思是这样的:

存在的问题:

可靠消息最终一致性方案

这个的意思,就是干脆不要用本地的消息表了,直接基于 MQ 来实现事务。比如阿里的 RocketMQ 就支持消息事务。

大概的意思就是:

这个还是比较合适的,目前国内互联网公司大都是这么玩儿的,要不你就用 RocketMQ 支持的,要不你就自己基于类似 ActiveMQ或者RabbitMQ自己封装一套类似的逻辑出来,大致架构思路如下图:


其中消息状态维护三种状态:

  • init
  • sent
  • end

最大努力通知行方案

这个方案的大致意思就是:

举报

相关推荐

0 条评论