分布式事务 3 种方案比较

前言

最近业务变动准备面试,看了一下别人的面试情况,都问了关于分布式事务的问题。所以今天整理一下。

分布式事务解决方案

1. XA 方案(两阶段提交方案)
  • 支持的场景:一个服务操作多个数据库,要求事务跨数据库保持一致性
  • 实现原理:事务管理器(服务器)对多个资源管理器(数据库)发起事务,多个资源管理器完成事务任务后先不进行 commit 操作,事务管理器检查所有资源管理器上的事务是否都能够完成并都处于待提交状态。如果有至少一个文件管理器无法完成被分配的事务任务,则事务管理器通知全部文件管理器进行回滚。如果全部文件管理器都进入了待提交状态,则事务管理器发起提交请求,让资源管理器提交各自的事务。
  • 优点:通过事务管理器本身支持的事务性操作来实现回滚操作,业务侧实现比较简单。
  • 缺点:一个服务操作多个数据库的场景,现在几乎不存在。现在的服务基本都是微服务的形式,每个服务只有自己的一个数据库或者没有数据库。如果一个服务操作多个数据库,那么除了操作自己的数据库还要操作别人的数据库,那就乱套了。别人的数据库是不可能让你操作的。
2. TCC 方案(Try - Confirm / Cancel)
  • 支持的场景:TCC 方案可以支持强一致性的分布式事务,适合于银行转账等要求强一致性的场景
  • 实现原理:事务分为三个阶段,即 T - C - C。首先是 Try 阶段通知所有参与的服务器检查资源并且锁定资源,如果全部服务器都可以正常执行 try,则执行 confirm 操作,即让参与的服务器执行各自的操作,如果有一个服务器无法满足 try 执行的条件,则向其他服务器发送 cancel 命令,撤回对资源的锁定。
  • 示例:银行账户 A 转账 100 元到账户 B,且这两个账户分别隶属于服务器①和服务器②,事务发起的服务器记作服务器③。try 阶段:服务器③向服务器①②发送 try 指令,服务器①锁定 A 账户并检查 A 账户余额是否大于等于 100,服务器②锁定 B 账户。confirm 阶段:如果 try 阶段无异常,则服务器③向服务器①②发送 confirm 指令,服务器①将 A 账户余额减去 100 并保存,服务器②向 B 账户增加 100。 如果 try阶段不能正确执行,比如 A 账户余额只有 90 了,则执行 cancel 命令,释放锁定的 AB 账户。
  • 优点:强一致性,确保完全的事务完整性
  • 缺点:所有事务操作代码,例如回滚,都需要业务侧自行编写,极大增加了开发难度。另外,由于网络问题,try-confirm-cancel 信号可能受到影响,会出现诸多问题,例如,没有收到 try 就收到了 cancel 那么服务器必须支持空回滚,或者收到了两次 confirm,则要求服务器支持幂等操作。
3. 可靠消息最终一致性方案
  • 支持场景:没有强一致性要求,只要求最终一致性的场景,例如账单支付和商品发货,账单支付后,无需同时进行商品发货只要最终商品可以发货就行
  • 实现原理: 例如服务器A 支持账单支付,服务器 B 支持商品发货,服务器 A 在执行账单支付之前发送一条 prepare 到消息队列,如果发送失败,则服务器 A 立即取消后续操作,如果发送成功,则服务器 A 继续支付操作,支付成功则发送成功消息给消息队列,支付失败则发送失败消息给消息队列。如果是成功的消息,则服务器 B 马上执行发货操作,如果失败则一直重试,直到成功或者超时。如果 B 超时未完成,则想办法通知 A 回滚,或者发送报警消息进行人工回滚。
  • 优点:简单高效易于实现,能够实现最终一致性
  • 缺点:无法实现强一致性
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容