首页 > 其他分享 >【金九银十必问面试题】站在架构师角度分析问题,如何解决TCC中的悬挂问题

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

时间:2022-09-07 15:00:47浏览次数:64  
标签:面试题 十必 事务 接口 Try Cancel 架构师 执行 TCC

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

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

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

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

问题解析

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

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

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

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

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

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

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

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

image-20220803203513145

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

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

img

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

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

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

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

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

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

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

高手:

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

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

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

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

总结

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

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

file

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构
如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

标签:面试题,十必,事务,接口,Try,Cancel,架构师,执行,TCC
From: https://www.cnblogs.com/mic112/p/16665454.html

相关文章

  • Vue面试题13:说一说key的作用
    思路分析:1.给出结论,key的作用是用于优化patch性能;2.key的必要性;3.实际使用方式;4.总结:可从源码层面描述一下vue如何判断两个节点是否相同;回答范例:1.key的作用......
  • 【面试题】JS实现数组扁平化处理,妙不可言啊!
    JS实现数组扁平化处理点击打开视频讲解更加详细期望结果:将数组扁平化并去重最终得到一个升序且不重复的数组步骤:1、数组扁平化2、去重......
  • 阿里前端一面必会面试题(附答案)
    浏览器的主要组成部分⽤户界⾯包括地址栏、前进/后退按钮、书签菜单等。除了浏览器主窗⼝显示的您请求的⻚⾯外,其他显示的各个部分都属于⽤户界⾯。浏览器引擎在⽤户......
  • 前端面试题
    js面试题undefinednullundefined假如变量没有被赋值,那么这个变量就是undefinedundefined表示变量未定义,typeof值为undefined。可以被重写(现代js标准已经规定......
  • 京东前端面试题
    代码输出结果f=function(){returntrue;};g=function(){returnfalse;};(function(){if(g()&&[]==![]){f=functionf(){return......
  • 前端面试题每日3题——2022-09-06
    每日3题22以下代码执行后,控制台中的输出内容为?vara=[1,2,3];a.join=a.shift;console.log(a==1&&a==2&&a==3);23以下代码执行后,控制台中的输出内......
  • 金九银十,收下这份 Java String 面试题
    请点赞关注,你的支持对我意义重大。......
  • 【面试题】js实现将excel表格copy到页面
    js实现将excel表格copy到页面点击打开视频讲解更加详细其实最核心的技术,还是copy的是我们粘贴板上的数据就像平常怎么粘贴复制其他的数据一样,只是我们在excel粘贴的是一......
  • Vue-面试题之生命周期函数
    1.什么是生命周期函数?vue组件对象在创建到销毁的过程中,在某一种条件成立的时刻系统会去调用的vue中设定的函数这些函数都叫做:生命周期函数2.vue的命周期函数......
  • 【博学谷学习记录】超强总结,用心分享|狂野架构师SpringCloud-Gateway
    目录SpringCloudGateway的工作流程Gateway动态路由配置中基于Path的路由方式过滤器分类常见默认过滤器添加响应头前缀处理增加前缀自定义过滤器1、实现GatewayFilter接口2......