cap

C:一致性被称为原子对象,任何的读写都应该看起来是“原子”,或串行的。写后面的读一定能读到前面写的内容,所有的读写请求都好像被全局排序。 A:对任何非失败节点都应该在有限时间内给出请求的回应。(请求的可终止性) P:允许节点之间丢失任意多的消息,当网络分区发生时,节点之间的消息可能会完全丢失

个人理解:

  1. 对于C,就是保证在一个时间点各个节点的状态是一致的,而A是在用户的视角看来各个节点都是正常的,P就是在节点看开各个节点都是正常连接
  2. 但在分布式环境中,多实例部署是基本条件,因为网络的不可靠性,造成了P成了硬性条件,所以分布式系统基本都是cp和ap的

base

  1. 基本可用(Basically Available)
  2. 软状态(Soft State)
  3. 最终一致性(Eventually Consistent)

个人理解:

  1. base理论落地基本都是ap的系统,分布式事务和业务有着强耦合的关系,因为基本上业务层面要维持一个中间状态好让事务可以有回滚余地而不破坏数据
  2. 其次因为有中间状态所以在事务的过程中基本都是最终一致

xa

如图基本分以下三种角色

  1. AP 应用程序
  2. RM 资源管理器
  3. TM 事务管理器

个人理解:

  1. 基本各个资源管理器要实现各自的资源管理接口
  2. 应用程序向资源管理器申请资源,然后对资源的修改不是直接通知资源管理器,而是预先准备好,然后由三方的事务管理器统一进行修改
  3. 使用该协议的系统基本都是cp类型的系统

2pc/3pc

2pc:

个人理解:

  1. 在prepare阶段对事务执行完毕剩下事务提交,只要一处执行出问题就触发事务回滚
  2. 在提交阶段由于网络问题可能会有不一致的问题
  3. 各个事务之间相互依赖成功,锁定资源的时间过长(阻塞时间过长)
  4. 对于事务协调器有超时重新选举,但是各个服务没有超时机制

3pc

个人理解:

  1. 在2pc之上增加了一层,个人理解这一层是为了辅助超时阶段,因为在preCommit阶段事务已经就剩下提交其他服务也都确认成功,最后每个服务都会启动一个超时计划,到时直接提交而不是等待协调器来docommit, 而docommit就是提交命令,但是各个服务可能因为网络无法接收所以有个超时机制,也就是为了弥补2pc中的阻塞过长和服务端没有超时机制

tcc

个人理解:

  1. tcc本质就是base中的业务提供一种中间态,通过准备提交和回滚来完成整体事务
  2. 整体增加了事务管理器来自动化的进行管理事务的进程,比如宕机后事务管理器会定时的去执行日志记录中事务的进程保证最终一致性
  3. 一般分布式事务都会传递全局事务id来标识事务和解决幂等性

sega

个人理解sega很像2pc但是sega的事务都是自己提交自己的,对于集中式出问题由主业务进行回滚或者重试,对于分布式而是递归的形式进行回滚

上述的几个问题

  1. 整体上我这样理解,sega是最终一致性的,但是又不会有base的中间状态,所以会有隔离性的问题,容易出现幻读重复度,读更改等各种问题,对于解决方案一般都是sega对应的框架自行提供全局读写锁来进行提供隔离性
  2. 对于sagas框架来看,他实现了事务协调器来简化事务的回滚和重试,实现了一套自行生成回滚sql的机制来进行
  3. 对于sagas还有很多设计,目前个人没有时间研究后续研究透了会重写相关sagas的问题(对于sagas历史好像最开始是阿里收费项目gks,当时看人反汇编代码说实现可能是自动生成回滚代码的tcc,现在看来是saga的模式加全局锁)

sega2种回滚方案

  1. backward recovery,向后恢复,补偿所有已完成的事务,如果任一子事务失败。即上面提到的第二种执行顺序,其中j是发生错误的sub-transaction,这种做法的效果是撤销掉之前所有成功的sub-transation,使得整个Saga的执行结果撤销。
  2. forward recovery,向前恢复,重试失败的事务,假设每个子事务最终都会成功。适用于必须要成功的场景,执行顺序是类似于这样的:T1, T2, ..., Tj(失败), Tj(重试),..., Tn,其中j是发生错误的sub-transaction。该情况下不需要Ci

集中式

分布式

消息事务/本地消息事务

个人理解:

  1. 对于消息事务,本质就是保证消息能进入mq, 还要保证消息不丢失和持久化,然后其他业务是通过消息订阅来完成对应业务,主要还是要保证幂等性和重复投递的问题
  2. 而本地消息事务,本质就是将事务数据和本地事务一起持久化,而服务通过监听数据表来执行业务,当然也可以my直接通知
  3. 2者的本质都是将事务进行持久化,然后有个中间系统(宕机后继续事务)保证事务能完成整个流程

最大通知事务

个人理解:

  1. 保证本地事务处理完,事务处理器能接收到mq的数据和对记录有个日志,然后通过有规律的对外部系统进行主动通知(类似微信和支付宝支付回调)
  2. 当通知超时后后续不再通知,而是由外部系统自行调用接口进行查询

作者:kakj

链接:https://juejin.im/post/5efd9d9df265da22c966f8ce

来源:掘金

主动提交事务_对于分布式事务,我“开门见山”地谈到这些理解,面试官都听懵了...相关推荐

  1. 事务超时时间无效_阿里分布式事务组件 fescar/seata 对 XA 2PC 的改进及其设计思想...

    1. 二阶段提交协议的由来 X/Open 组织提出了分布式事务处理的规范 DTP 模型(Distributed Transaction Processing),该模型中主要定义了三个基本组件,分别是 ...

  2. 分布式事务框架_阿里分布式事务框架GTS开源啦!

    点击上方"Java后端技术",选择"置顶或者星标" 每天带你看高清大图哦! 整理:开源中国 就在9号这天,阿里分布式事务框架GTS开源了一个免费社区版Fesca ...

  3. mysql回滚与错误提示_对mysql事务提交、回滚的错误理解 – jae – 博客园

    一.起因 begin或者START TRANSACTION开始一个事务 rollback事务回滚 commit 事务确认 人们对事务的解释如下:事务由作为一个单独单元的一个或多个 这句话本身没有什么问 ...

  4. mysql怎么用_面试官都是这样发问的,连环冲锋炮,看你怎么抵挡(上)

    本内容来源于和尚 16 年毕业的学长,先在 58,后阿里,如今准备跳槽了,以下内容为他的最近面试经历 我最近从大厂离职之后在合肥呆了个把月,之前已经准备了半个多月,从7月底开始投简历面试,目前是jav ...

  5. 阿里 mysql 架构_阿里java架构教你怎么用mysql怒怼面试官

    说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,很少提到我们的集群配置优化方案. 1.索引是什么 ...

  6. 面试不说点分布式的东西,面试官都有点看不起我呀

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 现在的面试和几年前的面试差距很大了,现在培训机构出来的同学很多都占一大部分,而且那张口要的可是真的有点多,甚至比一些工作两三年的朋友们还多, ...

  7. Seata多微服务互相调用_全局分布式事务使用案例_seata之原理剖析---微服务升级_SpringCloud Alibaba工作笔记0066

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 通过上面的案例,我们已经可以会使用seata进行全局的分布式事物的使用了,在多微服务相互调用的环境 ...

  8. 七点讲透分布式架构的前世今生,面试官都不知道的概念来了

    一.前言 以前我们聊过分布式架构的演进过程,那本文我们就来聊一聊目前主流的分布式架构和分布式架构中常见理论以及如何才能设计出高可用的分布式架构好了,基本上就是它的前世今生了. 分布式架构中,SOA和微 ...

  9. java的map 使用string数组多了双引号_奥奥奥利给!!!再也不怕面试官问我String源码了!来吧...

    简述 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了String 类来创建和操作字符串.字符串缓冲区支持可变字符串.因为String对象是不可变的,因此可以共享 ...

  10. java 获取文件大小_阿里Java后端开发面经,面试官都替我感到绝望

    点关注,不迷路:持续更新Java相关技术及资讯!!! 内容源于群友投稿!记录一次阿里Java后端开发面经,分享给大家,感谢支持! 前言 秋招面试的第一家公司,也是第一次面试,真的超级紧张,从自我介绍到 ...

最新文章

  1. Android Studio中有没有类似于Eclipse中的ctrl+2+L的快捷键? \Android Studio快捷键之代码提示...
  2. 【jquery】ajax 请求成功后新开窗口被拦截解决方法
  3. CentOS 7 安装nexus
  4. Git Submodule管理项目子模块
  5. Java中如何将List拆分为多个小list集合
  6. 维特比算法—打字输入预测
  7. 程序员怎么长久保持新鲜感?
  8. 删除a标签下面的横线
  9. [GNU LD系列 3.1]一些基本的链接脚本概念
  10. 1512. 好数对的数目
  11. 项目总结25:海康威视SDK-Java二次开发-客流量分析
  12. [互联网面试笔试汇总C/C++-9] 实现赋值运算符函数-剑指offer
  13. rsync linux 教程,rsync 用法教程
  14. MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型
  15. 百度如流智能工作平台2.0发布 聚焦智能组织
  16. 2020大创笔记(二)
  17. 笔记本如何关闭屏幕亮度自动调节(解决切换界面时屏幕忽明忽暗的问题)
  18. 电脑lol性能测试软件,lol电脑配置测试
  19. android透明功能引导页,Android 利用PagerView做引导页
  20. 中学学生成绩管理系统

热门文章

  1. Shell脚本 小程序演示
  2. [LeetCode] Best Time to Buy and Sell Stock
  3. Java多线程:线程同步与关键字synchronized
  4. Android Service使用需要注意事项
  5. php,javascript获取传递各参数的用法
  6. Asp.Net服务器控件添加OnClientClick属性绑定
  7. 关闭(取消)windows 2003中ie增强的安全配置?
  8. spring框架类加载顺顺序 并 在spring启动后查询数据库加载到容器内
  9. MyBatis入门使用及其四大核心对象
  10. MySQL 到底能不能放到 Docker 里跑? 1