分布式事务之理论基础

分布式事务的概念理论

事务


具备以下四个基本特性(ACID)

  • 原子性(Atomicity):一系列操作作被看作一个整体,要么全部成功,要么全部失败

  • 一致性(consistency):如果把所有参与者的数据看成是一个数据集,那么操作前后,数据的总量是不增不减的。也可以理解成数据是满足完整约束的。举例:一个数据集中只有两个参与者A&B,A持有100元,B持有0元,总额100元;A对B转账50元,余额50,B收到50,余额50,金额总量仍然是100,这就是一致性

  • 隔离性(Isolation):事务内部的数据对其它事务是不可见的,这也是对原子性的补充。原子性把系列操作看作一个操作,那么内部操作是不可见的

  • 持久性(Durability):一个事务完成之后数据被永远保存下来,其它操作和故障都不会对事务的结果产生影响

分布式事务


分布式事务是指事务的参与者,支持事务的服务器,资源服务器以及事务管理器分别位于不同的系统之中

也就是说,需要在不同的数据库之间实现事务

带来的挑战:

  1. 多个子系统独立,那么多个子系统所构成的大系统,导致了大系统的管理者也就是事务协调器外置,增加了一致性的难度

  2. 网络的不稳定性

一致性的划分


  • 强一致性:任何一次读都能都到最新的数据,系统中的所有参与者,看到的操作顺序,都和全局时钟下的顺序一致。简而言之,在任意时刻,所有节点中的数据是一致的

  • 弱一致性:数据更新后,如果能容忍后续的访问只能访问到部分或者全部访问不到,则是弱一致性

  • 最终一致性:不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着事件的迁移,不同节点上的同一份数据总是在向趋同的方向变化。简单说,就是在一段时间后,节点间的数据会最终达到一致性

弱一致性和最终一致性比较容易混淆,比较下区别:

弱一致性,指的是数据更新后,其它参与者并不会马上访问到,访问到的是历史数据,但是从访问的时间线来看,每次访问到的结果都是顺序的,所以也叫顺序一致性

最终一致性,指的是在一定的时间之后,访问到的结果是一样的,假如中间经过了N次操作,但是可能先访问到了之后的操作结果,然后再访问到之前的操作,但是经过一定的时间之后,访问到的数据是最新的

从这点来看,InnoDB实现的可重复读隔离级别就是弱一致性,通过MVCC实现快照读,读取到的不是最新数据,而是历史的某个快照

Zookeeper实现的zab协议,因为允许半数节点成功则提交,那么连接点失败节点的客户端读取到的也是历史数据,所以也叫顺序一致性

CAP原则


CAP分别指 Consistency(一致性),Avaliabity(可用性),Partition tolerance(分区容错性)

CAP原则的内容是:在一个分布式系统中,CAP不能同时满足

另外,这里的一致性指的是,在分布式系统中的所有数据备份,在同一时刻是否相同,也就是强一致性

CAP中,主要是C和A不能同时满足,即不能满足强一致性的情况下,还能满足可用性

证明CA不能同时满足

数据同步过程中,出现了网络无法访问,或者宕机的情况

此时只有两种方式: 要么阻塞等待网络或服务恢复之后,再同步,保证一致性

要么允许客户端访问到历史数据,保证可用性

BASE理论


BASE理论指的是基本可用Basically Avaliable,软状态Soft Stat,最终一致性

核心思想是即便无法做到强一致,但应该采用适合业务场景的方式保证最终一致性

比如:银行转账,A向B发起转账100元,系统首先冻结A账户100元,等待B成功收到100元之后,再将冻结金额扣除

银行转账的双方,都能接受数据的延迟,这就是适合业务场景的方式

分布式事务解决方案的理论模型

XA协议包含:

  • 两阶段提交2PC
  • 三阶段提交3PC

3PC在2PC的基础上增加了一个询问阶段和超时机制,避免资源被永久锁定,但仍然存在宕机的问题,导致数据不一致,因此3PC所做的工作有点多余

两阶段XA


2PC的执行分为两个步骤:

  1. Prepare:事务管理器向所有本地资源管理器发起请求,询问是否是ready状态,所有事务都将事务能否成功的信息反馈给协调者,锁住对应的资源

  2. Commit:事务管理器根据所有本地资源管理器的反馈,通知所有本地资源管理器,步调一致地在所有分支上提交或回滚

因此实现XA需要有3个接口,注意,这是在数据库层面的commit,rollBack

1.prepare接口,锁定资源

2.commit接口,提交事务

3.rollBack接口,回滚事务

存在的问题:

1.prepare锁住对用的资源,整个过程时阻塞的

2.事务协调者发生宕机,导致事务不一致

TCC


TCC理论上也是XA协议的一种实现,区别只是讲数据库层的XA提升到了service层

三个角色:事务协调者,事务发起者,事务参与者

TCC需要在Service层实现三个接口

  1. Try阶段,锁定对应的资源

  2. Confirm阶段,确认,提交资源

  3. Cancel阶段,取消,释放资源

XA总结


无论2PC,3PC还是TCC的理论模型可以看到,都无法完全保证事务的一致性

所以实际的上解决方案是XA的变种,但还是基于XA的

实际方案:

  • 在事务协调者中维护一个大事务表,记录状态

  • 在事务协调者中维护一个小事务表,记录每个事务参与者的状态

  • 事务协调者通过过定时检查大事务,然后再找到小事务对应的参与者,通过调用XA两阶段的两阶段接口进行补偿,达到最终一致

    所以,这也要求两阶段接口具有幂等性

本地消息表


本地消息表方案最初由ebay架构师提出,该方案中涉及消息生产者和消息消费者两个角色

本地消息表.jpg

步骤:

1.A业务事务完成时,写入一条消息到本地消息表,记录消息状态是否被成功处理,使用本地事务保证数据一致性,并发送数据到MQ,如果发送MQ失败,则使用定时任务扫描补偿

2.B业务消费MQ,并保证消费的幂等性,如果消费成功,则通知A业务更新消息表状态(可以是回调,也可以是MQ)

3.A业务根据通知消息更新消息状态

分析:

比较适合的场景是下单成功后,短信的发送,邮件的发送

如果是优惠券的发放,可能会出现优惠券不足,则可能会扣减失败,如果使用这种方式,则需要A业务设置一个中间状态,并支持回滚

尽最大努力通知


支付回调就是典型的尽最大努力通知的场景

第三方支付服务,如微信,支付宝,当处理完这笔订单之后,就会发起一个回调通知调用方

如果失败会继续重试,直到达到重试最大次数,然后交由对账系统来处理

分布式事务理论模型总结

从上面的分析可以看到,不同解决方案的理论模型适合不同的业务场景

主要参考:https://xiaomi-info.github.io/2020/01/02/distributed-transaction/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容