数据库事务要满足几个要求:ACID

Atomic(原子性)     事务必须是原子的工作单元

Consistent(一致性)  事务完成时,必须使所有数据都保持一致状态

Isolation(隔离性)    并发事务所做的修改必须和其他事务所做的修改是隔离的

Duration(持久性) 事务完成之后,对系统的影响是永久性的

CAP理论

CAP理论是:分布式系统在设计时只能在一致性(Consistency)、可用性(Availability)、分区容忍性(Partition
Tolerance)中满足两种,无法兼顾三种
CAP有哪些组合方式?
1、CA:放弃分区容忍性,加强一致性和可用性,关系数据库按照CA进行设计。
2、AP:放弃一致性,加强可用性和分区容忍性,追求最终一致性,很多NoSQL数据库按照AP进行设计。
说明:这里放弃一致性是指放弃强一致性,强一致性就是写入成功立刻要查询出最新数据。追求最终一致性是指允
许暂时的数据不一致,只要最终在用户接受的时间内数据 一致即可。
3、CP:放弃可用性,加强一致性和分区容忍性,一些强一致性要求的系统按CP进行设计,比如跨行转账,一次转
账请求要等待双方银行系统都完成整个事务才算完成。

在分布式系统设计中AP的应用较多,即保证分区容忍性和可用性,牺牲数据的强一致性(写操作后立刻读取到最
新数据),保证数据最终一致性。比如:订单退款,今日退款成功,明日账户到账,只要在预定的用户可以接受的
时间内退款事务走完即可。

2PC(略) 两阶段提交锁定时间长,对性能影响很大,不适合解决微服务下的分布式事务问题

2PC升级版:tcc:由事务管理器来调用两方的本地事务的try接口,都成功才能让各自confirm。 问题是入侵性太强

3PC(略)

2PC 和 3PC 都是存在问题的,一般采用AP理论,采用基于消息的最终一致性


使用消息队列(MQ)解决分布式事务(推荐)

各大知名的电商平台和互联网公司,几乎都是采用类似的设计思路来实现“最终一致性”的。这种方式适合的业务场景广泛,而且比较可靠。不过这种方式技术实现的难度比较大

1、订单服务和库存服务完成检查和预留资源。
2、订单服务在本地事务中完成添加订单表记录和添加“减少库存任务消息”。
3、由定时任务根据消息表的记录发送给MQ通知库存服务执行减库存操作。
4、库存服务执行减少库存,并且记录执行消息状态(为避免重复执行消息,在执行减库存之前查询是否执行过此
消息)。
5、库存服务向MQ发送完成减少库存的消息。
6、订单服务接收到完成库存减少的消息后删除原来添加的“减少库存任务消息”。
实现最终事务一致要求:预留资源成功理论上要求正式执行成功,如果执行失败会进行重试,要求业务执行方法实
现幂等。
优点 :
由MQ按异步的方式协调完成事务,性能较高。
不用实现try/confirm/cancel接口,开发成本比TCC低。
缺点:
此方式基于关系数据库本地事务来实现,会出现频繁读写数据库记录,浪费数据库资源,另外对于高并发操作不是
最佳方案。

1、支付成功后,订单服务向本地数据库更新订单状态并向消息表写入“添加选课消息”,通过本地数据库保证订单
状态和添加选课消息的事务。。
2、定时任务扫描消息表,取出“添加选课任务“并发向MQ。
3、学习服务接收到添加选课的消息,先查询本地数据库的历史消息表是否存在消息,存在则说明已经添加选课,
否则向本地数据库添加选课,并向历史消息表添加选课消息。这里选课表和历史消息表在同一个数据库,通过本地
事务保证。
4、学习服务接收到添加选课的消息,通过查询消息表判断如果已经添加选课也向MQ发送“完成添加选课任务的消
息”,否则则添加选课,完成后向MQ发送“完成添加选课任务的消息”,
5、订单服务接收到完成选课的消息后删除订单数据库中消息表的“添加选课消息”,为保证后期对账将消息表的消
息先添加到历史消息表再删除消息,表示此消息已经完成。

代码参考https://gitee.com/q975583865/xc_edu (xc-service-manage-order 和  xc-service-learning)

文档参考学成在线19章

分布式专题(六)分布式事物相关推荐

  1. 「分布式专题」分布式事务 就这?太简单了吧

    目录 基础概念 本地事务 分布式事务 基础理论 CAP理论 BASE理论 分布式事务解决方案 2PC TCC 可靠消息最终一致性 基础概念 本地事务 在计算机系统中,更多的是通过关系型数据库来控制事务 ...

  2. 分布式专题-数据库分库分表之Mycat01-数据库性能优化方案

    目录导航 前言 为什么要分库分表 数据库性能瓶颈主要原因 数据性能优化方案 SQL 与索引 表与存储引擎 架构 配置 操作系统与硬件 架构演进与分库分表 单应用单数据库 多应用单数据库 多应用独立数据 ...

  3. 分布式专题-NIO框架之Netty01-Java IO 演进之路

    目录导航 前言 Java IO 阻塞(Block)和非阻塞(Non-Block) 同步(Synchronization)和异步(Asynchronous) Java BIO 与 Java NIO Ja ...

  4. 分布式理论(六)—— Raft 算法

    分布式理论(六)-- Raft 算法 前言 我们之前讲述了 Paxos 一致性算法,虽然楼主尝试用最简单的算法来阐述,但仍然还是有点绕.楼主最初怀疑自己太笨,后来才直到,该算法的晦涩难懂不是只有我一个 ...

  5. 分布式专题(2)- 分布式 Java通信

    本篇一句话总结:Java实现分布式通信,可以基于Java API.开源框架和远程通信技术三种方式实现. 正文开始: 通过上一篇文章<分布式专题(1)- 计算机网络>我们知道了计算机之间之所 ...

  6. 「分布式专题」分布式系统中一致性hash算法

    近年来B2C.O2O等商业概念的提出和移动端的发展,使得分布式系统流行了起来.分布式系统相对于单系统,解决了流量大.系统高可用和高容错等问题.功能强大也意味着实现起来需要更多技术的支持.例如系统访问层 ...

  7. im即时通讯源码_IM消息ID技术专题(六):深度解密滴滴的高性能ID生成器(Tinyid)

    1.引言 在中大型IM系统中,聊天消息的唯一ID生成策略是个很重要的技术点.不夸张的说,聊天消息ID贯穿了整个聊天生命周期的几乎每一个算法.逻辑和过程,ID生成策略的好坏有可能直接决定系统在某些技术点 ...

  8. 分布式服务常见问题—分布式事务

    原文作者:程序员小灰 原文地址:漫画:什么是分布式事务? 有趣有内涵的文章第一时间送达! -----  第二天  ----- 假如没有分布式事务,在一系列微服务系统当中,假如不存在分布式事务,会发生什 ...

  9. 一致 先验分布 后验分布_「分布式技术」分布式事务最终一致性解决方案,下篇...

    各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题 上 ...

  10. 【分布式】关于分布式“一致性”的讨论

    文章目录 一.写在前面的话 二.数据库的事务 三.分布式环境的各种问题 三.CAP和BASE理论 四.一致性协议 (1)两阶段提交 (2)三阶段提交 (3)Paxos算法 五.写在最后的话 一.写在前 ...

最新文章

  1. php四排序-选择排序
  2. ASP.NET MVC 表单提交教程
  3. SupeSite后台添加新闻增加【预览】功能
  4. python如何遍历文件夹中的所有图片_python实现遍历文件夹图片并重命名
  5. android jni 调用java对象_Android NDK开发之Jni调用Java对象
  6. CreateProcess 执行CMD命令,并重定向输出
  7. 张一鸣退一步,换字节跳动的“海阔天空”
  8. Treeview动态添加用户控件 取值和传值(第二种样式)
  9. spark 添加依赖_单机用python写spark处理20G的数据
  10. python tkinter 窗口位置_Python tkinter调整元件在窗口中的位置与几何布局管理
  11. 我带上你 你带上钱,我们去班加罗尔
  12. 南京晓庄学院c语言试卷,南京晓庄学院—C语言期末考试复习提纲.doc
  13. Feign报错java.lang.NoSuchFieldError: MULTIPART_RELATED
  14. Android APK瘦身之Android Studio Lint (代码审查)
  15. 在动画中添加音乐和声音
  16. 火星编年史_雷.布拉德伯里
  17. java中正则表达式校验日期,1999-01-01 ,1991\01\01,-分割和\分割两种形式
  18. Android控制图片在屏幕内缩放和移动
  19. 百余名人辞世,刚过去的2016是被诅咒的一年吗?MIT数据分析预测这只是个开始……...
  20. 序列数据的数据增强方法综述

热门文章

  1. Educode--头歌 《软件工程》实验作业
  2. Android逆向小技巧①:从Activity下手找到切入点,逆向分析支付宝APP
  3. python 当当京东比价
  4. 盘点数据库2013之一:数据分析崛起
  5. IMT-2020(5G)推进组的《5G网络架构设计》白皮书
  6. dependencies 和 devDenpendencies 的区别
  7. 【5GC】5G网络切片与5G QoS的区别?
  8. python希腊字母怎么生成_#python sympy怎样把狄克拉函数定义出来#
  9. Xshell-7工具栏隐藏了
  10. python定义一个求和函数_Python定义函数实现累计求和操作