美文网首页
分布式事务

分布式事务

作者: 雨落千木的时节 | 来源:发表于2019-01-24 11:40 被阅读0次

一、分布式事务产生的原因

在传统的单体应用中,即使应用有多个模块,这多个模块使用一个数据源,不存在分布式事务的问题。当随着需求的变化,单体应用已不能满足我们的需要,单体应用被拆分为微服务系统,多个模块被拆分为单独的应用服务,每个应用都用独自的数据库事务。这样,服务之间的数据一致性就无法保证。我们需要分布式的事务来保障全局的事务一致性。

二、分布式事务的解决方案

1.基于XA协议的两阶段提交

XA是一个分布式事务协议,XA包含两个部分:事务管理器和资源管理器。资源管理器由数据库实现,但是在mysql5.7之前的版本不支持XA协议;事务管理器作为全局的调度者,负责各个本地资源的提交和回滚。XA两端提交原理如下:


微信截图_20190123165541.png 微信截图_20190123165600.png

第一阶段:
1.事务管理器通知各个事务的资源管理器开始准备事务。
2.资源管理器收到通知后进入准备阶段,写好事务日志并执行事务,但是不提交事务,只是将准备就绪的消息返回给事务管理器。
第二阶段:
1.事务管理器在接收各个资源管理器消息后开始进行分析,如果有任意一个失败,则发送事务回滚命令,否则发送提交命令。
2.资源管理器在收到事务管理器的消息后,提交事务,并将提交信息返回给事务管理器。
XA分布式事务比较简单,成本比较低,但是性能比较差,无法满足高并发的业务场景。

2.基于消息中间件的事物+最终一致性

基于消息中间件的事务,主要是通过将本地事务和消息发送放在一个事务里面,保证本地事务成功而且消息发送成功,否则的话两者都失败,事务进行回滚。如下图:


微信截图_20190123185350.png

1.1.A系统向消息中间件发送预备消息,一旦出错A系统的操作不会执行
1.2.消息中间件保存预备消息并返回成功,失败则A系统的操作不执行
2.A系统执行本地事务,如果失败则回滚事务
3.向消息中间件发送消息,消息中间件收到消息后先保存消息,然后发送给B系统,由B系统执行本地事务,若消息中间件保存消息成功则A系统事务一定成功
4.消息中间件执行回调接口给A系统发送消息,若系统成功收到回调消息,则证明B系统的事务也是成功的,这样就实现了最终一致性。

消息中间件的解决方案虽然提高了系统性能,但是事务不是严格一致的,如果B系统执行失败,A系统事务无法回滚。此外对消息中间件依赖较大,万一消息中间件不可用将会导致所有的业务都无法进行。

3.TCC模式

TCC模式是由业务系统来实现的,通过对业务逻辑的调度来实现分布式事务,主要由三个操作组成:try,confirm,cancle。try:尝试执行业务,confirm:确认执行业务,cancle:取消执行业务。

TCC模式对代码的嵌入性高,要求每个业务都要写这三步代码,事务一致性由开发者来控制,业务开发难度比较高。

4.TXC模式

TXC模式为阿里开源的GTS项目中命名的模式,项目地址:https://github.com/alibaba/fescar/wiki/%E6%A6%82%E8%A7%88,TXC模式和XA协议有点类似,主要原理如下:

微信截图_20190124104841.png
微信截图_20190124105131.png

Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
Transaction Manager (TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。

1.TM向TC申请开启一个全局事务,全局事务创建成功,并生成一个全局唯一的xid;
2.xid在微服务的调用链上下文中传播;
3.RM向TC注册分支事务,将其纳入XID对应的全局事务的管辖中;
4.TM向TC发起针对XID的全局事务的提交或者回滚决议;
5.TC调度XID下管辖的全部分支事务来完成事务的提交或者回滚。

TXC模式极大的减少了分支事务对资源的锁定时间,提高了并发的性能。

5.LCN模式

LCN模式是通过代理Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。详见:https://www.txlcn.org/zh-cn/docs/principle/lcn.html

该模式对代码的嵌入性低,仅限于本地存在连接对象且可通过连接对象控制事务的模块。缺陷在于代理的连接需要随事务发起方一共释放连接,增加了连接占用的时间。
参考:
https://www.cnblogs.com/zengkefu/p/5742617.html
https://www.txlcn.org/zh-cn/docs/preface.html
https://blog.csdn.net/ggibenben1314/article/details/48812501
https://github.com/alibaba/fescar/wiki/%E6%A6%82%E8%A7%88

相关文章

  • 分布式事务与分布式锁

    一、分布式事务 什么事分布式事务 分布式事务就是指事务的资源分别位于不同的分布式系统的不同节点之上的事务。 分布式...

  • 微服务分布式事务--破局

    微服务架构下分布式事务设计实战 商品 订单 支付 分布式事务->长事务本地事务->短事务 分布式事务: 比如 下...

  • 分布式事务

    目录 分布式事务解决方案 长事务: saga 短事务: 设计的时候尽量短事务,能不用分布式事务尽量不用,分布式事务...

  • ATOMIKOS+JTA分布式事务记录

    ATOMIKOS+JTA是用来分布式事务的中间件,那么什么是分布式事务呢? 事务,分为单机事务,分布式事务;单机事...

  • 分布式事务

    一、什么是分布式事务 二、分布式事务产生的原因/分布式事务的应用场景 三、分布式事务的基础/理论 CAP/BASE...

  • 微服务 14:初探微服务分布式事务 - Seata

    1:什么是事务,什么是ACID 2:什么是分布式事务 3:分布式事务解决方案 4:Seata 分布式事务框架 5:...

  • 分布式事务的解决方案

    本文从以下几个方面介绍分布式事务的解决方案: 为什么会有分布式事务分布式事务经典模型分布式事务解决方案 为什么会有...

  • MySQL分布式事务支持

    MySQL分布式事务介绍 InnoDB存储引擎提供了对XA事务的支持,并通过XA事务来支持分布式事务的实现。分布式...

  • 微服务中分布式事务解决方案

    分布式事务解决方案 1、阿里巴巴seata分布式事务 2、 京东ShardingSphere分布式事务 3、tcc...

  • 解密分布式事务框架-Fescar

    1.分布式事务 我曾经能不用分布式事务就别用分布式事务,因为会引入很多的复杂度。虽然再网上有很多开源的分布式事务框...

网友评论

      本文标题:分布式事务

      本文链接:https://www.haomeiwen.com/subject/gvajjqtx.html