CAP理论与BASE理论

首先要和大家说的就是大名鼎鼎的CAP理论与BASE理论了,这两个理论与解决分布式事务问题是密切相关的。

其实网上有很多关于CAP与BASE相关的文章,一写就写了一大堆,篇幅很长,让人看起来头大。王子将以最简短的文字让大家理解它们的含义。

CAP理论

CAP,就是Consistency、Availability、Partition Tolerence的简称,简单来说,就是一致性、可用性、分区容忍性。

首先说说一致性,这不就是字面意思吗,保证分布式系统下各个环节的数据是一致的,准确无误的。

再说可用性,同样字面意思理解,保证分布式系统出现异常、宕机情况下依然对用户可用。

最后是分区容错性,这个看起来不太好理解,其实你就把它理解成假如分布式服务器之间出现网络故障,依然可以正常运转就行了。

所以CAP理论我们就介绍完了。

另外要说明的是CAP是不能同时满足的,只能满足CP或者AP。

首先既然是分布式环境,那么就一定涉及到网络问题,所以P是一定要保证的。如果放弃了使用P,而选择CA,那么网络出现问题时,如果各个节点都分别操作一下数据,就很可能出现数据不一致的情况,所以为了保证C,就要禁止多节点同时写入数据,也就是加锁,这就违背了A的可用性要求,因为加锁的时候是不可用的。

BASE理论

那BASE理论又是什么呢?

所谓的BASE,英文是Basicly Available、Soft State、Eventual Consistency,也就是基本可用、软状态、最终一致性。

首先说基本可用,你可以简单理解成在分布式系统中基本保证同时满足CAP理论。

然后是软状态,我们都知道分布式系统是无法同时保证CAP的,为了保证数据的一致性,往往需要一段数据处理时间,这段时间内数据是可能出现不一致的,这段时间就被称为软状态。软状态的表现形式其实我们已经体验过了,比如你给订单支付的时候,会提醒你“正在支付中,请稍后”,这段时间你是不能操作订单的。

最后是最终一致性,也就是说无论中间数据不一致的时间持续多久,最终都会保证数据的一致,这就是最终一致性,就比如消息中间件。

CAP理论与BASE理论是解决分布式事务的基本知识,我们理解到这个程度就可以了。

XA规范与2PC/3PC分布式事务

XA规范

我们先了解一下什么是XA规范。

有个叫做X/Open的组织定义了分布式事务的模型,这个模型中包含了几个角色,分别是AP(Application,应用,说白了就是我们的系统),TM(Transaction Manager,分布式事务管理器),RM(Resource Manager,资源管理器,可以理解成数据库),CRM(Communication Resource Manager,通信资源管理器,可以是消息中间件),他们之间的关系如图10.1所示:

分布式事务说白了就是一个横跨多个数据库的事务,这个事务里,涉及了多个数据库的操作,然后要保证多个数据库中,任何一个操作失败了,其他所有库的操作全部回滚。

而XA就是定义好的那个TM与RM之间的接口规范,XA仅仅是个规范,具体的实现是数据库产商来提供的。

2PC

2PC说白了就是基于XA规范搞的一套分布式事务的理论,意思就是两阶段提交,分别是准备阶段和提交阶段。

(1)准备阶段,简单来说就是TM先发送个prepare消息给各个数据库,让各个库先把分布式事务里要执行的各种操作,先执行好,但不提交,同时返回一个响应消息给TM,如果成功了就发送一个成功的消息,如果失败了就发送一个失败的消息。

(2)提交阶段,主要分为两种情况,一种情况就是TM接收到失败的消息或者超时没有接到消息,TM就认为本次事务出现错误,就会发送给所有RM回滚的消息,并且认为回滚一定会成功;另一种情况就是TM接收到成功的消息,那么就会发送给所有RM提交的消息,并且认为每个RM收到消息后一定会成功执行提交操作。

看到这里,小伙伴们觉得2PC的方案可靠吗?

没错,2PC的方案是不可靠的。

首先,当TM发送prepare消息给RM的时候,会锁定资源,如果其他人要访问这个资源就会进入阻塞状态。

然后如果TM是一个单机的,就,会存在单点故障问题。

那么如果我们把TM做成了双机热备,且支持双机自动切换,那么如果此时TM发送了prepare消息给某个RM,之后就发生故障,进行了备机的切换,此时这个备机是不知道之前的主机做了什么的,就会导致状态信息的丢失。

另外,如果有些数据库接收到了commit消息,有些数据库由于脑裂问题没有接收到消息,那么数据就出现问题了。

3PC

既然我们知道2PC的方案是不可靠的,所以当然要解决了,于是3PC方案诞生了,它就是三阶段提交,过程如下:

(1)TM向RM发送CanCommit消息,然后等待RM返回结果,注意的是此时RM并没有执行事务,其实就是检查了一下网络是否正连通。

(2)如果所有的RM都返回连接正常,那么TM接着向RM发送PreCommit消息,这个阶段就是2PC中的第一个阶段,RM接收消息执行事务但不提交。如果有RM返回连接不正常,那么TM就会发送abort消息给RM,直接终止事务。

(3)如果TM发送了PreCommit消息后,并接收到RM成功的响应,那么就会发送DoCommit给RM,RM收到消息执行提交操作。如果返回了错误的响应或者超时未响应,那么就发送abort消息给RM执行回滚。

简单来讲3PC就是这样,这个时候小伙伴们就会问了,新增了一个阶段到底对2PC有什么改进呢?

这就要说到3PC的PreCommit阶段了,TM发送PreCommit给RM后,各个RM是有自己的超时机制的,如果收到了PreCommit并且返回成功了,一段时间后没有接收到TM发送的DoCommit请求,那么RM会认为TM出现了故障,自动执行提交操作。这样就解决了TM单点故障的问题。

为什么可以这样做呢?这就是因为新增了一个CanCommit确认的阶段。

不过虽然这样做解决了TM的单点故障问题,但实际上还是有缺陷的。

如果TM本来是想要发送abort消息给RM的,但未发送之前就挂掉了,那么RM超时后自动执行提交操作数据不是又出问题了。

所以2PC与3PC本质上都不能保证分布式事务的绝对可靠。

往期文章推荐:

JVM专栏

消息中间件专栏

并发编程专栏

闲聊CAP、BASE与XA的更多相关文章

  1. 分布式数据库中CAP原理(CAP+BASE)

    分布式数据库中CAP原理(CAP+BASE) 传统的ACID 1)原子性(Atomicity): 事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功. 2)一致性(Con ...

  2. [转帖]浅谈分布式一致性与CAP/BASE/ACID理论

    浅谈分布式一致性与CAP/BASE/ACID理论 https://www.cnblogs.com/zhang-qc/p/6783657.html ##转载请注明 CAP理论(98年秋提出,99年正式发 ...

  3. 分布式中 CAP BASE ACID 理解(转载)

    概念理解(CAP,BASE, ACID) CAP CAP:  Consistency, Availability, Partition-tolerance 强一致性(Consistency).系统在执 ...

  4. 分布式事务 XA 两段式事务 X/open CAP BASE 一次分清

    分布式事务: 分布式事务是处理多节点上 的数据保持 类似传统 ACID 事物特性的 一种事物. XA:是一种协议,一种分布式事务的协议,核心思想是2段式提交. 1 准备阶段  2 提交阶段.XA协议是 ...

  5. 分布式系列文章——从ACID到CAP/BASE

    事务 事务的定义: 事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元(Unit),狭义上的事务特指数据库事务. 事务的作用: 当多个应用程序并发访问 ...

  6. 大型网站一致性的基础理论---CAP/BASE

    最近在看<大型网站系统与java中间件事件>这本书,收获颇多. 分布式事务希望在多机环境下可以像单机系统那样做到强一致,这需要付出比较大的代价.而在有些场景下,接受状态并不用时刻保持一致, ...

  7. ACID CAP BASE介绍

    ACID ACID,是指数据库管理系统(DBMS)在写入/更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性).一致性 ...

  8. 分布式:ACID, CAP, BASE

    本文主要讲述分布式系统开发的一些相关理论基础. 一.ACID ACID是一系列对系统中数据进行访问与更新的操作所组成的一个程序执行的逻辑单元,狭义上的事务特指数据库事务. 1.Atomic原子性 事务 ...

  9. ACID/CAP/BASE 理论知识

    ACID是事务的四大特性,想要成为事务,必须具备这四点. Atomicity 原子性体现在对于一个事务来讲,要么一起执行成功要么一起失败,执行的过程中是不能被打断或者执行其他操作的. Consiste ...

随机推荐

  1. Vue2+Koa2+Typescript前后端框架教程--05Sequelize的使用(ORM)

    本篇开始分享Node.js后端服务开发中对于数据结构ORM的实现,主要使用的技术栈是:Sequelize. 上一篇文章中讲到班级管理的数据结构:ID,班级名称,班级编码,班主任ID,使用的数据库是My ...

  2. loj #6179. Pyh 的求和 莫比乌斯反演

    题目描述 传送门 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m \varphi(ij)(mod\ 998244353)\) \(T\) 组询问 \(1 \leq ...

  3. PHP 插件资源

    PHP   jsonRPC  百度云网盘地址  https://pan.baidu.com/s/1itCIhrdd5bPGJMefNUuKvw   提取码 : ax4d PHP Excel 百度云网盘 ...

  4. keycloak集成微信登陆~解决国内微信集成的问题

    之前看了国内写的微信集成keycloak的文章,然后拿来就用了,但我的是jboss部署的keycloak,然后使用他的包之后,会出现类无法找到的问题,之后找了很多资料,多数都是国外的,在今天终于找到了 ...

  5. C++ 简单输出当前日期时间

    根据https://www.runoob.com/cplusplus/cpp-date-time.html编写. 首先介绍2个数据类型. 一个是time_t,与时间函数相关的变量,定义的变量记录着自 ...

  6. 【JavaWeb】XML 文件

    XML 文件 简介 XML 是可拓展的标记性语言. XML 的主要作用: 用来保存数据,且这些数据具有自我描述性: 作为项目或模块的配置文件: 作为网络数据传输的格式,但是现在以 JSON 格式为主. ...

  7. 通过写n本书的积累,我似乎找到了写好技术文章的方法(回复送我写的python股票电子书)

    我写的书不算少,写的博文就更多了,但大多数书的销量也就一般,而我写的技术文章里,虽然也有点击过万的,但不少点击量也就只有三位数. 通过不断反思,也通过对比了一些畅销书和顶流文章,我似乎找到了一些原因, ...

  8. 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟

    题目分析: 本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...

  9. 原生javascript制作省市区三级联动详细教程

    多级联动下拉菜单是前端常见的效果,省市区三级联动又属于其中最典型的案例.多级联动一般都是与数据相关联的,根据数据来生成和修改联动的下拉菜单.完成一个多级联动效果,有助于增强对数据处理的能力. 本实例以 ...

  10. (十四)json、pickle与shelve模块

    任何语言,都有自己的数据类型,那么不同的语言怎么找到一个通用的标准? 比如,后端用Python写的,前端是js,那么后端如果传一个dic字典给前端,前端肯定不认. 所以就有了序列化这个概念. 什么是序 ...