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)。
二阶段提交的一些问题:
实践demo:https://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
最大努力通知行方案
这个方案的大致意思就是: