大家好,我是冰河~~

今天,咱们就暂时不聊【精通高并发系列】了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作——《深入理解分布式事务:原理与实战》一书正式出版了,于2021年10月20日开始在当当预售,当天即登上当当新书榜第一的位置!

划重点:当当10.20~10.24限时5折优惠!!打开当当首页,搜索:分布式事务,找到5折优惠商品链接,点击加购,下单即可。

本地事务

本地事务流程

在介绍分布式事务之前,我们先来看看本地事务。首先,我们先来一张图。

由上图,我们可以看出,本地事务由资源管理器(比如DBMS,数据库管理系统)在本地进行管理。

本地事务的优缺点

本地事务具备相应的优点,也有其不足。

优点:

  • 支持严格的ACID属性。
  • 可靠,事务实现的效率高(只是在本地操作)。
  • 可以只在RM(资源管理器)中操作事务。
  • 编程模型简单。

缺点:

  • 缺乏分布式事务的处理能力。
  • 数据隔离的最小单元由RM(资源管理器决定),开发人员无法决定数据隔离的最小单元。比如:数据库中的一条记录等。

ACID属性

说起事务,我们不得不提的就是事务的ACID属性。

  • A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失
    败的情况。
  • C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。比如:张三向李四转100元,
    转账前和转账后的数据的正确状态叫作一致性,如果出现张三转出100元,李四账户没有增加100元这就出现了数
    据错误,就没有达到一致性。
  • I(Isolation):隔离性,数据库中的事务一般都是并发的,隔离性是指并发的两个事务的执行互不干扰,一个事
    务不能看到其他事务运行过程的中间状态。通过配置事务隔离级别可以避脏读、重复读等问题。
  • D(Durability):持久性,事务完成之后,该事务对数据的更改会被持久化到数据库,且不会被回滚。

分布式事务

随着业务的快速发展,网站系统往往由单体架构逐渐演变为分布式、微服务架构,而对于数据库则由单机数据库架构向分布式数据库架构转变。此时,我们会将一个大的应用系统拆分为多个可以独立部署的应用服务,需要各个服务之间进行远程协作才能完成事务操作。

我们可以使用下图来表示刚开始我们系统的单体架构。

上图中,我们将同一个项目中的不同模块组织成不同的包来进行管理,所有的程序代码仍然是放在同一个项目中。

后续由于业务的发展,我们将其扩展为分布式、微服务架构。此时,我们将一个大的项目拆分为一个个小的可以独立部署的微服务,每个微服务都有自己的数据库,如下所示。

又比如,在我们的程序中,经常会在同一个事务中执行类似如下的代码来完成我们的需求。

@Transactional(rollbackFor = Exception.class)
public void submitOrder() {orderDao.update(); // 更新订单信息accountService.update(); // 修改资金账户的金额pointService.update(); //  修改积分accountingService.insert(); // 插入交易流水merchantNotifyService.notify(); // 通知支付结果
}

上述代码中的业务,仅仅在submitOrder()方法上添加了一个@Transactional注解,这能够在分布式场景下避免分布式事务的问题吗?很显然是不行的。

如果上述代码所对应的:订单信息、资金账户信息、积分信息、交易流水等信息分别存储在不同的数据里,而支付完成后,通知的目标系统的数据同样是存储在不同的数据库中。此时就会产生分布式事务问题。

分布式事务产生的场景

跨JVM进程

当我们将单体项目拆分为分布式、微服务项目之后,各个服务之间通过远程REST或者RPC调用来协同完成业务操作。典型的场景就是:商城系统中的订单微服务和库存微服务,用户在下单时会访问订单微服务,订单微服务在生成订单记录时,会调用库存微服务来扣减库存。各个微服务是部署在不同的JVM进程中的,此时,就会产生因跨JVM进程而导致的分布式事务问题。

跨数据库实例

单体系统访问多个数据库实例,也就是跨数据源访问时会产生分布式事务。例如,我们的系统中的订单数据库和交易数据库是放在不同的数据库实例中,当用户发起退款时,会同时操作用户的订单数据库和交易数据库,在交易数据库中执行退款操作,在订单数据库中将订单的状态变更为已退款。由于数据分布在不同的数据库实例,需要通过不同的数据库连接会话来操作数据库中的数据,此时,就产生了分布式事务。

多服务单数据库

多个微服务访问同一个数据库。例如,订单微服务和库存微服务访问同一个数据库也会产生分布式事务,原因是:多个微服务访问同一个数据库,本质上也是通过不同的数据库会话来操作数据库,此时就会产生分布式事务。

注意:跨数据库实例场景和多服务单数据库场景,本质上都是因为会产生不同的数据库会话来操作数据库中的数据,进而产生分布式事务。这两种场景是大家比较容易忽略的。

分布式事务解决方案

知道了分布式事务产生的场景后,接下来,我们就聊聊分布式事务具体有哪些解决方案。

2PC方案

2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit
phase),2是指两个阶段,P是指准备阶段,C是指提交阶段。

这里,我们用MySQL数据库举例,MySQL数据库支持两阶段提交协议,可以分为成功和失败两种情况。

成功情况

失败情况

具体流程如下:

准备阶段(Prepare phase): 事务管理器给每个参与者发送Prepare消息,每个数据库参与者在本地执行事
务,并写本地的Undo/Redo日志,此时事务没有提交。
(Undo日志是记录修改前的数据,用于数据库回滚,Redo日志是记录修改后的数据,用于提交事务后写入数
据文件)

提交阶段(commit phase): 如果事务管理器收到了参与者的执行失败或者超时消息时,直接给每个参与者
发送回滚(Rollback)消息;否则,发送提交(Commit)消息;参与者根据事务管理器的指令执行提交或者回滚操
作,并释放事务处理过程中使用的锁资源。

使用2PC方案时,需要注意的是:必须在最后阶段释放锁资源。

可靠消息最终一致性方案

可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能
够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一致。

事务发起方(消息生产方)将消息发给消息中间件,事务参与方从消息中间件接收消息,事务发起方和消息中间件
之间,事务参与方(消息消费方)和消息中间件之间都是通过网络通信,由于网络通信的不确定性会导致分布式事
务问题。 所以,我们在具体方案中会引入消息确认服务和消息恢复服务。

使用可靠消息最终一致性方案时需要注意几个问题:

  • 本地事务与消息发送的原子性问题。
  • 事务参与方接收消息的可靠性问题。
  • 消息重复消费的问题(需要实现幂等)。

TCC方案

TCC分为三个阶段:

  • Try 阶段 是做业务检查(一致性)及资源预留(隔离),此阶段仅是一个初步操作,它和后续的Confirm 一起才能
    真正构成一个完整的业务逻辑。
  • Confirm 阶段 是做确认提交,Try阶段所有分支事务执行成功后开始执行 Confirm。通常情况下,采用TCC则
    认为 Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。若Confirm阶段真的出错了,需引
    入重试机制或人工处理。
  • Cancel 阶段 是在业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放。通常情况下,采
    用TCC则认为Cancel阶段也是一定成功的。若Cancel阶段真的出错了,需引入重试机制或人工处理。

使用TCC分布式解决方案时需要注意空回滚、幂等、悬挂等问题。

最大努力通知型方案

此种方案主要用于多个不同系统之前保证数据的最终一致性,大体如下图所示。

使用最大努力通知型方案需要注意幂等和数据的回查操作。

写在最后

为了让小伙伴们更好的了解本书,在文章最后冰河附上几张精美的图片。

哈哈,喜欢的小伙伴当当下单即可,有啥问题可以私信冰河咨询,冰河看到后都会一一解答。

写在最后

如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~

推荐阅读:

  • 《实践出真知:全网最强秒杀系统架构解密,不是所有的秒杀都是秒杀!!》
  • 《从零到上亿用户,我是如何一步步优化MySQL数据库的?(建议收藏)》
  • 《我用多线程进一步优化了亿级流量电商业务下的海量数据校对系统,性能再次提升了200%!!(全程干货,建议收藏)》
  • 《我用多线程优化了亿级流量电商业务下的海量数据校对系统,性能直接提升了200%!!(全程干货,建议收藏)》
  • 《我用10张图总结出了这份并发编程最佳学习路线!!(建议收藏)》
  • 《高并发场景下一种比读写锁更快的锁,看完我彻底折服了!!(建议收藏)》
  • 《全网最全性能优化总结!!(冰河吐血整理,建议收藏)》
  • 《三天撸完了MyBatis,各位随便问!!(冰河吐血整理,建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程知识是你必须要掌握的!完整学习路线!!(建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些核心技能是你必须要掌握的!完整学习路线!!(建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:这些计算机与操作系统基础知识越早知道越好!万字长文太顶了!!(建议收藏)》
  • 《我用三天时间开发了一款老少皆宜的国民级游戏,支持播放音乐,现开放完整源代码和注释(建议收藏)!!》
  • 《我是全网最硬核的高并发编程作者,CSDN最值得关注的博主,大家同意吗?(建议收藏)》
  • 《毕业五年,从月薪3000到年薪百万,我掌握了哪些核心技能?(建议收藏)》
  • 《我入侵了隔壁妹子的Wifi,发现。。。(全程实战干货,建议收藏)》
  • 《千万不要轻易尝试“熊猫烧香”,这不,我后悔了!》
  • 《清明节偷偷训练“熊猫烧香”,结果我的电脑为熊猫“献身了”!》
  • 《7.3万字肝爆Java8新特性,我不信你能看完!(建议收藏)》
  • 《在业务高峰期拔掉服务器电源是一种怎样的体验?》
  • 《全网最全Linux命令总结!!(史上最全,建议收藏)》
  • 《用Python写了个工具,完美破解了MySQL!!(建议收藏)》
  • 《SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏)》
  • 《MySQL 8中新增的这三大索引,直接让MySQL起飞了,你竟然还不知道!!(建议收藏)》
  • 《撸完Spring源码,我开源了这个分布式缓存框架!!(建议收藏)》
  • 《亿级流量高并发秒杀系统商品“超卖”了,只因使用的JDK同步容器中存在这两个巨大的坑!!(踩坑实录,建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:要想学好并发编程,这些并发容器的坑是你必须要注意的!!(建议收藏)》
  • 《公司的报表工具太难用,我三天撸了个Excel工具,运营小姐姐直呼太好用了,现已开源!!(建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程核心技能是你必须要掌握的!!(建议收藏)》
  • 《阿里面试官:高并发大流量秒杀系统如何正确的解决库存超卖问题?(建议收藏)》
  • 《Redis五大数据类型与使用场景汇总!!(含完整实战案例,建议收藏)》

好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,我是冰河,我们下期见~~

分布式事务开山之作——《深入理解分布式事务:原理与实战》草图曝光!!相关推荐

  1. 【新书速递】分布式事务开山之作,带你深入理解分布式事务

    随着互联网的不断发展,互联网企业的业务在飞速变化,推动着系统架构也在不断地发生变化.总体来说,系统架构大致经历了 单体应用架构→垂直应用架构→分布式架构→SOA架构→微服务架构的演变.如今微服务技术越 ...

  2. 这部分布式事务开山之作,凭啥第一天预售就拿下当当新书榜No.1?

    大家好,我是冰河~~ 今天,咱们就暂时不聊[精通高并发系列]了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作--<深入理解分布式事务:原理与实战>一书 ...

  3. mysql数据库事务的概念_如何理解数据库事务中的一致性的概念?

    比较支持@Kai Peng 的答案,只是缺少例子说明. 而其他一些人的答案甚至有明显的错误.最近正好也在研究这方面的东西,不算是回答,就是跟大家讨论讨论. 首先,我们需要搞清楚为什么会出现事务.[1] ...

  4. 分布式服务架构精讲pdf文档:原理+设计+实战,(收藏再看)

    前言 如果你期待对分布式系统有一个更全面的认识,想要了解各个技术在分布式系统中如何应用.分别解决哪些问题.有怎样优秀的实现,推荐阅读.收藏本篇. 分布式.微服务几乎是现在的技术人员必须要了解的架构方向 ...

  5. 《深入理解分布式事务》第五章 强一致性分布式解决方案

    <深入理解分布式事务>第五章 强一致性分布式解决方案 文章目录 <深入理解分布式事务>第五章 强一致性分布式解决方案 一.强一致性事务概述 1.典型方案 2.适用场景 3.优缺 ...

  6. 透彻理解Spring事务设计思想之手写实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原 ...

  7. 【手写系列】透彻理解Spring事务设计思想之手写实现

    事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Dura ...

  8. 冰河联合猫大人又出版一本分布式事务领域的开山之作,这是要再次起飞了吗?

    大家好,我是冰河~~ 继出版<海量数据处理与大数据技术实战>和<MySQL技术大全:开发.优化与运维实战>之后,冰河联合猫大人一起推出了另一部硬核书籍<深入理解分布式事务 ...

  9. oledb 访问接口sqlncli10返回了消息 没有活动事务_这样理解分布式事务你是不是就会懂了?...

    分布式事务主要解决分布式一致性的问题.说到底就是数据的分布式操作导致仅依靠本地事务无法保证原的性.与单机版的事务不同的是,单机是把多个命令打包成一个统一处理,分布式事务是将多个机器上执行的命令打包成一 ...

最新文章

  1. VC使用ActiveX控件常见问题
  2. Android AudioPolicyService和AudioPolicyManager
  3. pacman常用命令
  4. Two Merged Sequences
  5. php+mysql留言板小案例
  6. 前端如何调用后端接口_后端开发:如何写出可靠的接口
  7. 自动化运维之部署Puppet
  8. leetcode 491. 递增子序列 思考分析
  9. 我们在使用计算机时,不能做什么?,11秋季学期计算机应用技术基础学习周期_01任务-在线作业[1]1...
  10. Linux下cat 命令
  11. 解决:Ubuntu18.04配置exoprt LC_ALL=C后无法打开终端
  12. html input提交按钮无法使用,无法找到并单击提交按钮使用mshtml.HTMLInputElement
  13. 用计算机制作标准曲线的方法,如何绘制标准曲线
  14. 【寻址方式】基地址与偏移地址的详细解释
  15. PKUWC2019 总结
  16. 2012 九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)
  17. eclipse使用技巧——备注格式的定义与模板
  18. 商丘学院计算机基础,商丘学院
  19. react点击后高亮显示
  20. DAVSE VCC-H10004K超高清会议摄像机

热门文章

  1. Kubernetes(k8s)之Volume(卷)
  2. 泰勒公式专题 拉格朗日余项与佩亚诺余项,麦克劳林公式
  3. 外盘国际期货招商:每日港股市场要闻
  4. MySql下最好用的数据库管理工具是哪个?
  5. 戴尔EMC服务器重装系统
  6. allure安装与使用
  7. 什么是坐标系,不同坐标系之间有什么区别
  8. LumaQQ源码,注解.下载的用户看一下.
  9. 基于主成分分析(PCA)的人脸识别
  10. Linux将正在运行的前台程序放到后台执行