目录
考察目的
这个问题考察难度不算大,考察4年以上Java开发经验的同学
分布式事务主要涉及到跨库事务处理问题,除了考察求职者对这方面知识的了解以外,还想了解一下求职者的实际处理经验。
问题分析
通常情况下,传统的关系型数据库只能保证单个数据库中多个数据表的事务特性。一旦多个SQL操作涉及到多个数据库,这类的事务无法解决跨库事务问题。
在传统架构下,这种问题出现的情况非常少,但是在分布式微服务架构中,分布式事务的问题变得更加突出。
以电商项目为例,假设我们要实现电商系统中的支付功能,它的实现流程如下(如图)。在微服务架构中,应用被拆分成以业务模块为单元的服务,并且每个服务有自己的数据库系统。
当用户发起支付时,会涉及到以下几个事务操作:
1. 创建支付订单
2. 从资金服务中扣除余额
3. 从红包服务中扣除余额
4. 更新支付结果
这是四个典型的事务操作,而且这些操作分别属于不同的数据库,最终期望的结果是希望这三个服务所对应的数据是一致的,很显然传统的事务无法解决这个问题!
因此就产生了分布式事务的问题,所谓分布式事务,就是事务具有分布式特性,简单理解就是如何实现多个跨数据库的小事务组成的大事务的ACID特性。
问题解答
分布式事务是指存在多个跨库事务的事务一致性问题,
或者是指在分布式架构下由多个应用节点组成的多个事务之间的事务一致性问题。
目前主流的分布式事务解决方案有两种:
1、一种是基于XA协议实现的强一致性事务方案,比如Atomikos、Seata中的XA事务模型。基于CAP理论可以知道,如果要保证分布式事务的强一致性,就必然会带来性能的影响从而影响到可用性。所以强一致性事务性能会比较低。
2、另一种是基于BASE理论下的弱一致性事务解决方案,比如TCC事务模型、基于可靠性消息的最终一致性方案、Seata的Saga事务模型等。
最终一致性事务损失了数据的强一致性,通过异步补偿的方式达到数据的最终一致。因此在性能上比较好,适用于并发量比较高的场景。