当前位置: 首页 > 科技观察

分布式事务分析及简单实现

时间:2023-03-16 01:47:15 科技观察

在分布式系统中,为了保证数据的高可用,我们通常会保留数据的多份副本,这些副本会分别放在不同的物理机上。为了给用户提供CRUD等正确的语义,我们需要保证这些放在不同物理机上的副本是一致的。在现在分布式无处不在的系统中,分布式事务几乎是必不可少的。先说说什么是交易?分布式事务、事务隔离级别、ACID这些东西相信大家都不陌生,那么什么是事务呢?概念:泛指要做或完成的事情。指的是作为单个逻辑工作单元执行的一系列操作,要么全部执行,要么都不执行。简单的说,事务就是并发控制的单位,是用户定义的一系列操作。特点:事务是恢复和并发控制的基本单位。事务应该具有四个属性:原子性、一致性、隔离性和持久性。这四种特性通常被称为ACID特性。原子性:事务是一个不可分割的工作单元,事务中包含的操作要么完成,要么不完成。一致性:事务必须将数据库从一种一致状态更改为另一种状态。一致性和原子性是密切相关的。隔离性:一个事务的执行不能被其他事务干扰。即一个事务内使用的操作和数据与其他并发事务隔离,并发执行的事务之间不能相互干扰。持久性:持久性,也称为持久性,是指一旦事务被提交,它对数据库中数据的改变应该是永久性的。随后的其他操作或故障不应对其产生任何影响。那么什么是分布式事务呢?这里举个简单的例子:你可以想一想,你的订单流程可能涉及到10多个环节。您已成功下单并付款,但您的优惠券扣减失败。加分失败,前者公司被欺负,后者用户不爽,但这些都是在不同的服务中,如何保证大家的成功呢?分布式事务。分布式事务是指涉及多个数据库操作的事务。实际上,同库事务的概念被推广到多个库的事务。目的是确保分布式系统中的数据一致性。分布式事务处理的关键是必须有一种方法可以知道事务在任何地方的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)。比较出名的分布式事务有:2pc(两阶段提交)3pc(三阶段提交)TCC(Try,Confirm,Cancel)半消息/最终一致性(RocketMQ)这里我介绍最简单的2pc(两阶段),以及大家以后可能更常用的半消息事务就是最终一致性。其他交易类似,也有很多优点。当然也有各种弊端:比如数据库资源长期被锁定,导致系统响应迟钝,无法并发上去。网络抖动出现脑裂情况,导致交易参与者不能很好地执行协调者的指令,造成数据不一致。单点故障:比如某个时刻事物的协调器宕机,虽然可以通过选举机制产生新的leader,但是过程中难免会出现问题,而TCC,只有强大的技术团队才能支撑发展,成本太高。高的。我们先从介绍这两个东西开始。2pc(双阶段提交):第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)2pc(双阶段提交)可以说是一个分布式事务的开始,就像非常红娘,就是通过消息中间件或者全事务管理来协调多个系统。当两个系统操作事务时,他们锁定资源但不提交事务。当两者都准备好后,告诉消息中间件或所有事务管理器,然后分别提交事务。不管最终结果如何,第二阶段都会结束当前事务,但是问题是如果系统A提交成功,但是系统B在提交的时候因为网络波动或者各种原因失败了,还是会失败。最终一致性:在整个过程中,我们可以保证:业务主动方提交本地事务失败,业务被动方不会收到消息的投递。只要业务主动方的本地事务执行成功,消息服务就会将消息传递给下游的业务被动方,最终保证业务被动方能够成功消费消息(消费成功或失败,即最后一定有终态)。然而,技术就是这样。我们需要考虑各种极端情况,很难有一个完美的解决方案。这就是为什么有这么多的分布式事务解决方案,例如三阶段、TCC和尽力而为通知。你要知道你为什么要做,做它有什么好处和坏处,在实际开发中注意就好,系统是根据业务场景设计的,没有业务的技术是没有意义的,没有技术的生意没有信心。【本文为栏目组织《AiChinaTech》原创文章,微信公众号(id:tech-AI)》】点此查看作者更多好文