分布式事务解决方案

后端bug开发工程师
• 阅读 523

一、什么是分布式事务

在早期的单体架构时期,所有的数据操作都在同一个数据库里面进行,比如:A给B转100块钱,A的账户余额-100,B的账户余额+100,这两个操作放在同一个事务里面即可,由数据库来保证事务的原子性、一致性、持久性、隔离性。但是随着业务量、数据量的加大,放在一个数据库里面很难支撑,所以需要对数据库按照业务来进行拆分,比如积分兑换商品下单操作涉及如下操作: 1.用户积分扣减(积分数据库) 2.商品库存扣减(商品库存数据库) 3.订单创建(订单数据库) 这三个操作在三个不同的数据库里面进行,这样就导致传统的数据库事务不能保证这三个操作的原子性了,于是就需要分布式事务来处理这类问题。

二、常见的分布式事务解决方案有哪些?

1.两阶段提交协议 由事务协调者和事务参与者构成,把分布式事务分成两个阶段: 一阶段:事务协调者调用各个事务参与者进行资源准备,这个阶段各个参与者会执行本地事务,进入prepare阶段,但是本地事务不会提交; 二阶段:事务协调者根据调用结果,来决定第二阶段是执行commit还是rollback操作,如果一阶段中只要有一个参与者返回失败,就执行rollback操作,只有当所有参与者都返回成功时才执行commit操作。 两阶段协议有什么缺点呢? (1)性能较差:因为会阻塞性的锁定数据库资源,如果其中某个参与者执行很慢,其它的参与者也需要等着; (2)可能导致数据不一致:如果参与者和协调者都挂了; (3)可靠性较差:协调者存在单点故障的问题,如果出现故障,参与者就会一直处于阻塞状态。

2.三阶段提交协议 在两阶段提交的基础上多加了一个阶段:先问一下每个参与者是否可以提交事务,如果可以就会进入第二阶段,这个阶段会锁定数据库资源,后面两个阶段在两阶段协议的基础上增加了参与者如果等待协调者超时,可以直接提交事务的处理。 三阶段的优点:如果协调者出现问题,参与者不会一直阻塞; 缺点:没有解决数据一致性的问题,在第三阶段如果协调者出现问题时可能导致数据不一致。

3.TCC 一阶段为try,二阶段为confirm或者cancel;2PC和3PC都是数据库层面的,而 TCC 是业务层面的分布式事务,就像我前面说的分布式事务不仅仅包括数据库的操作,还包括发送短信等,这时候 TCC 就派上用场了! TCC属于补偿型事务,一阶段会先预留资源,如果成功则确认,否则补偿退回就行。 TCC最大的缺点就是需要自己实现try、confirm、cancel三个方法,对业务侵入性较大,实现起来也会比较麻烦。使用TCC要注意一下几个问题: (1)空回滚:如果try还没执行,cancel方法就执行了,这个时候没有资源可以补偿,需要允许这种case发生,直接发挥成功就好; (2)防悬挂:上面说到了允许空回滚的发生,那try方法可能后面又会执行,如果不处理,会导致资源会锁住了,并且不会释放; (3)幂等:confirm、cancel方法需要考虑网络等问题导致的执行失败,需要重试的问题。

4.本地事务表 缺点:需要增加本地消息表,对业务侵入较大。

5.事务性消息 不是所有的消息中间件都支持,目前主流的只有rocketMq支持,同时对业务也有一定的侵入。与TCC相比,二者使用的场景不太一样,TCC一阶段就会锁定所有资源,如果失败了解除资源锁定就好了,但是事务性消息并没有锁定所有资源,生产者发送成功了,通过重试的方式保证消费者也能消费成功,如果消费不成功需要告警然后人工介入处理。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
Spring事务(一):Spring事务的使用
什么是事务事务的经典举例:某人要在商店使用电子货币购买100元的东西,当中至少包括两个操作:1.该人账户减少100元2.商店账户增加100元事务就是要确保以上两个操作都能完成或者一起取消,否则就会出现100元平白消失或出现的情况。(摘自wiki(https://www.oschina.net/action/
Easter79 Easter79
3年前
TiDB 性能竞赛 11.16
TiDB实现了快照隔离级别的分布式事务,支持悲观锁、乐观锁,同时也解决了大事务的难点。事务是数据库的基础,提供高效的、支持完整ACID的分布式事务更是分布式数据库的立足之本。事务是数据库执行的最小单元,允许用户将多个读写操作组合为一个逻辑单元。事务需要满足原子性、一致性、隔离性和持久性,也就是ACID。数据库有多种并发控制方法,乐观并发控制(
Wesley13 Wesley13
3年前
MySQL 乐观锁和悲观锁
前言  1)在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和一致性以及数据库的一致性。  2)加锁是为了解决更新丢失问题更新丢失  两次更新同时进行,后一次更新覆盖了前一次更新的情况,更新丢失是数据没有保证一致性导致的。事务A查询余额,
Wesley13 Wesley13
3年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Wesley13 Wesley13
3年前
MySQL InnoDB如何保证事务特性
如果有人问你“数据库事务有哪些特性”?你可能会很快回答出原子性、一致性、隔离性、持久性即ACID特性。那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可以直接跳过不看啦(^.^)先说结论:redolog重做日志用来保证事务的持久性undolog回滚日志保证事务的原子性undologredo
Wesley13 Wesley13
3年前
MySQL(三,事务)
数据库事务特点ACID原子性,一致性,隔离性,永久性ACID是Atomic(原子性)Consistency(一致性)Isolation(隔离性)Durability(持久性)数据库事务说是如何实现的?1.通过预写日志方式实现的,redo和undo机制是数据库实现事务的基础2.redo日志用来在断电/数据
Wesley13 Wesley13
3年前
MySQL知识体系——事务
ACID(事务的四大特性)    四个特性中,最重要的就是一致性。由原子性,隔离性,持久性来保证。(以下描述用例:用户A、B、C分别在银行拥有500元存款)    原子性(Atomicity)        事务是一个不可分割的工作单元,事务中的操作要么全部COMMI
Stella981 Stella981
3年前
25 张图,1.4 w字!彻底搞懂分布式事务原理
!(https://oscimg.oschina.net/oscnet/0c08fb0b18a1456caf7fee690e02de5e.jpg)本文提纲如下:0\.前言1\.单数据源事务&多数据源事务2\.常见分布式事务解决方案2.1.分布式事务模型
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
3年前
Mysql事务,并发问题,锁机制
1、什么是事务事务是一条或多条数据库操作语句的组合,具备ACID,4个特点。原子性:要不全部成功,要不全部撤销隔离性:事务之间相互独立,互不干扰一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏持久性:事务的提交结果,将持久保存在数据库中2、事务并发会产生什么问题1)第一类丢失更新:在没有事务隔离的情况下,两个事务都同时