“如何解决TCC中的悬挂问题”!

一个工作了4年的Java程序员,去京东面试,被问到这个问题。

大家好,我是Mic,一个工作了14年的Java程序员

这个问题面试官想考察什么方面的知识?我们又该怎么回答呢?

问题解析

TCC是分布式事务问题里面的解决方案,一般在应聘互联网公司的时候问的比较多。

实际上,在TCC这个事务解决方案里面,除了悬挂问题以外,还有空回滚、幂等性需要考虑。

但是我们在应用的时候都是采用一些成熟的框架,比如Seata,这些框架本身就帮我们解决了。

导致大部分人不知道这个问题的意思。

所谓TCC,其实就是(Try-Confirm-Cancel),也就是把一个事务拆分成两个阶段,类似于传统的XA事务模型。

Try这个阶段,是实现业务的检查,预留必要的业务资源。

Confirm,真正执行业务逻辑,只需要使用try阶段预留的业务资源进行处理就行。

Cancel,如果事务执行失败,就通过cancel方法释放try阶段预留的资源。

在TCC事务模式下,我们通过一个事务协调器来管理多个事务,每个事务先执行try方法。

当所有事务参与者的try方法执行成功,就执行confirm方法完成真正逻辑的执行,一旦任意一个事务参与者出现异常,就通过cancel接口触发事务回滚,释放Try阶段占用的资源。

很显然,这是一个最终一致性的实现方案,因此当Try执行成功,就必须确保Confirm执行成功。

当Try执行失败,就必须确保Cancel实现资源释放。

而面试题中提到悬挂问题,指的是TCC执行Try接口出现网络超时时候,使得TCC触发Cancel接口回滚,但可能在回滚之后,这个超时的Try接口才被真正执行,也就导致Cancel接口比Try接口先执行。

从而造成Try接口预留的资源一直无法释放,这种情况就是悬挂。

以上就是TCC悬挂问题的背景,它确实是每个成熟的高级开发必须要了解的细节。

因为有可能会造成比较严重的生产事故。

了解了背景之后,我们应该如何解决呢?下面来看看高手的回答。

高手:

对于悬挂问题,我认为只需要保证Cancel接口执行完以后,Try接口不允许在执行就可以了。

所以,我们可以在Try接口里面,先判断Cancel接口有没有执行过,如果已经执行过,就不再执行。

是否执行过的这个判断,可以在事务控制表里面插入一条事务控制记录来标记这个事务的回滚状态。

然后在Try接口中只需要读取这个状态来判断就行了。

总结

好了,今天的分享就到这里结束了。

如果喜欢我的作品,记得点赞、收藏、关注!!!

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构

如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

【金九银十必问面试题】站在架构师角度分析问题,如何解决TCC中的悬挂问题的更多相关文章

  1. apk开发环境!多亏这份《秋招+金九银十-腾讯面试题合集》跳槽薪资翻倍!再不刷题就晚了!

    开头 最近很多网友反馈:自己从各处弄来的资料,过于杂乱.零散.碎片化,看得时候觉得挺有用的,但过个半天,啥都记不起来了.其实,这就是缺少系统化学习的后果. 为了提高大家的学习效率,帮大家能快速掌握An ...

  2. 金九银十跳槽高峰,面试必备之 Redis + MongoDB 常问80道面试题

    前言 有着“金九银十”之称的招聘旺季已经开启,跳槽高峰期也如约而至. 本文为主要是 Redis + MongoDB 知识点的攻略,希望能帮助到大家. 内容较多,大家准备好耐心和瓜子矿泉水. Redis ...

  3. 备战金九银十,Java研发面试题(Spring、MySQL、JVM、Mybatis、Redis、Tomcat)[带答案],刷起来!

    八月在即,马上就是"金九银十",又是跳槽招聘季.咱们这行公认涨薪不如跳槽加的快.但不建议频繁跳槽,还是要学会融合团队,抓住每个机会提升技能. 苏先生在这里给大家整理了一套各大互联网 ...

  4. 不等"金九银十",金风八月,我早已拿下字节跳动的offer

    字节跳动,我是在网上投的简历,之前也投过一次,简历都没通过删选,后来让师姐帮我改了一下简历,重新投另一个部门,获得了面试机会.7月23日,中午HR打电话过来预约了下午4点半面试,说会在线写代码,让我准 ...

  5. “金九银十”已过,总结我的天猫、蚂蚁、头条面试经历(Java岗)

    跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽.切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的 ...

  6. 金九银十想去跳槽面试?那这份Java面经你真得看看了,写的非常详细!

    前言 前两天在和朋友吃饭的时候聊到时间这个东西是真的过的好坏啊,金三银四仿佛还在昨天.一眨眼金九银十又快到了,对程序员来说这两个是一年最合适的跳槽涨薪环节了,今年的你已经做好准备了吗?不妨看看这篇文章 ...

  7. 金九银十,史上最强 Java 面试题整理。

    以下会重新整理所有 Java 系列面试题答案.及各大互联网公司的面试经验,会从以下几个方面汇总,本文会长期更新. Java 面试篇 史上最全 Java 面试题,带全部答案 史上最全 69 道 Spri ...

  8. 两年经验拿到蚂蚁金服,字节offer,附上金九银十BAT面试核心知识点整理

    前言 我自己是本科毕业后在老东家干了两年多,老东家算是一家"小公司"(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身),毕业这两年多我也没有在大厂待过,因此找 ...

  9. 金九银十跳槽季,程序员面试点解析之Java专场

    前言 近年来Java工程师这个岗位炙手可热,市场需求大,学习Java的人也越来越多,所以IT企业与求职者的选择都比较多,那么IT企业在面试时都会提哪些问题呢.下面为大家分享 Java高级工程师面试阿里 ...

随机推荐

  1. 会话技术 Cookie+Session

    会话:这种在多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session) 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开: 功能:在一次会话 ...

  2. 校验日期格式为yyyy-MM-dd

    /** * 校验时间 * * @param text * @return */ public static boolean checkTime(String text) { DateFormat fo ...

  3. CANN算子:利用迭代器高效实现Tensor数据切割分块处理

    摘要:本文以Diagonal算子为例,介绍并详细讲解如何利用迭代器对n维Tensor进行基于位置坐标的大批量数据读取工作. 本文分享自华为云社区<CANN算子:利用迭代器高效实现Tensor数据 ...

  4. multiset 用法复习

    前言 看题解上有 \(\text{multiset}\) 然后发现没脑子的我又忘了... 正文 \(\text{multiset}\) 可以看成一个序列,插入一个数,删除一个数都能够在 \(O(\lo ...

  5. android studio 初印象

    ANSROID STUDIO sdk 目录 build-tools目录,存放各版本Android的各种编译工具. docs目录,存放开发说明文档. extras\android目录,存放兼容低版本的新 ...

  6. CentOS7系统DNS主从配置

    CentOS7系统DNS主从配置:一.DNS服务器正向解析:1.1 基础环境:主机IP          主机名      操作系统    用途192.168.0.110   master      ...

  7. Tapdata 实时数据融合平台解决方案(二):理解数据中台

    作者介绍:TJ,唐建法,Tapdata 钛铂数据 CTO,MongoDB中文社区主席,原MongoDB大中华区首席架构师,极客时间MongoDB视频课程讲师. 数据中台定义: 以打通部门或数据孤岛的统 ...

  8. gpg加解密异常

    在本地windows电脑和开发环境(linux) ,都不报错,但是在测试环境(linux) 上报错. 报错信息 org.bouncycastle.openpgp.PGPException: Excep ...

  9. 08 MySQL_SQL_DQL_select数据查询条件判断

    导入*.sql数据到数据库 windows系统 ​ source d:/tables.sql; Linux系统 source /home/soft/桌面/tables.sql; 导入完成后 测试查询 ...

  10. 分享一个基于Abp Vnext开发的API网关项目

    这个项目起源于去年公司相要尝试用微服务构建项目,在网关的技术选型中,我们原本确认了ApiSix 网关,如果需要写网关插件需要基于Lua脚本去写,我和另外一个同事当时基于这个写了一个简单的插件,但是开发 ...