大家好,我是 ZHF,一个工作了 5 年的 Java 程序员 在互联网企业的面试中,经常会问到分布式、高并发下的技术问题,其中分布式事务问题就是其中之一。 下面我们来看一下,关于分布式事务的解决方案,一般人和高手是如何回答这个问题的! 一般人的回答: 分布式事务,就是多个事务分布在不同的节点上导致的数据一致性问题。 我们公司的业务基本上都没涉及分布式事务问题,不过我知道像开源的框架 Seata,就是用来解决分布式事务的框架。 然后,分布式事务有一个强一致性和弱一致性问题,强一致性会影响性能,弱一致性会影响数据的准确性。 这样的回答没错但是不够突出不能让面试官惊喜,下面我们来看一下高手的回答 高手的回答: 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点之上。 比如大型的电商系统中的下单场景,会涉及扣库存、优惠促销计算、订单 ID 生成。通常情况下,库存、促销、主键生成策略都位于不同的服务器和数据库表中。 下单接口的成功与否,不仅取决于本地节点的数据库操作,而且还依赖第三方系统的结果,这时候分布 式事务就保证这些操作要么全部成功,要么全部失败。 因此,本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 基于 CAP 定理可以知道,对于上述情况产生的分布式事务问题,我们要么采用强一致性方案、要么采用弱一致性方案。
- 所谓强一致性,就是指通过第三方的事务管理器来协调多个节点的事务,保证每个节点的事务达到 同时成功和同时失败,为了实现这样一个需求,我们会引入 Xopen/DTP 模型提供的 XA 协议,基 于 2pc 或者 3pc 的方式来实现。但是,在如果全局事务管理器中的多个节点中,如果任意一个节 点在进行事务提交确认时,由于网络通信延迟导致阻塞,就会影响到所有节点事务的提交,而这个 阻塞过程也会影响阻塞用户的请求线程,这对于用户体验以及整体性能的影响较大。
- 而弱一致性方案,就是针对强一致性方案所衍生出来性能和数据一致性平衡的一个方案,简单来说 就是损失掉强一致性,数据在某一个时刻会存在不一致的状态,但是最终这些数据会达成一致。这样的好处是提升了系统的性能。