为什么需要事务
事务的基本概念
事务是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体向系统提交,要么全部执行,要么全部不执行。事务的核心目的是保证多个相关操作的整体性。
事务的重要性
事务可以避免因各种原因而导致数据不一致,产生错误的数据,事务可以保证数据安全。
经典案例: 张三向小明转账1000元
步骤1. 张三账户扣减1000元
步骤2. 小明账户增加1000元
如果没有事务保证,步骤1成功后系统发生故障,那么张三将损失1000元,数据一致性被破坏。
单机事务
事务的基本特征:ACID
事务的4项基本特征为原子性、一致性、隔离性、持久性,简称 ACID。
- 原子性(Atomicity) :事务中的所有操作要么全部完成,要么全部不执行,不存在中间状态。
- 一致性(Consistency) :事务操作前与操作后,数据的完整性保持一致性或满足完整性约束(从一个正确的状态到另一个正确的状态)
- 隔离性(Isolation) :并发执行的事务相互隔离,每个事务都感觉不到其他事务在同时执行。
- 持久性(Durability) :事务提交后,对数据的修改就是永久性的,即使系统故障也不会丢失。
其中一致性是事务的目的。而该目的是由原子性、隔离性、持久性来保证的。
事务并发问题
要提升系统的吞吐量,就需要多个事务同时执行,而多个事务交叉执行,如果处理不当,就会导致数据出现不同程度的丢失或覆盖。
- 更新丢失(Lost Update)
当两个事务更新同一行数据时,双方都不知道对方的存在,就有可能覆盖对方的修改。比如两个人同时编辑一个共享文档,最后一个改完的人总会覆盖掉前面那个人的改动。
- 脏读(Dirty Read)
事务A在执行时临时修改了某条数据而未完成该事务,此时事务B读取了这条被修改过的数据,并基于这条数据做了一些操作。如果事务A此时回滚了,撤回了修改,那么事务B读到的数据就是无效的脏数据。
- 不可重复读(Non-repeatable Read)
同样是两个事务在操作同一数据,如果在事务A开始时读了某数据,这时候事务B修改了这条数据,等到事务A后续再次去读这条数据的时候发现内容已经变了,从而无法再继续本次事务,也就是重复读同一条数据无法获得相同的结果。
- 幻读(Phantom Read)
与上方场景相同,事务一开始按某个查询条件没查出任何数据,结果因为另一个事务的影响,再去查时却查到了数据,这种就像产生幻觉了一样,被称作幻读。
事务并发问题的解决方案
要解决事务并发问题的最好方式,当然就是不要并发,也就是多个事务按顺序执行,即串行化。
但更多时候,我们会为了提升性能和吞吐量,而宁愿付出一些可以接受的代价。
目前主流数据库都提供了不同的事务隔离级别,可根据不同业务场景在性能和代价之间进行权衡。
| 隔离级别 | 实现方式 | 存在问题 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|---|---|
| 读未提交Read uncommitted | 事务没提交的就可以读 | 未提交的事务一旦回滚,读取到的数据就是错误的 | 存在 | 存在 | 存在 |
| 读已提交Read committed | 事务提交后的数据才能读到 | 事务执行过程中,若其它事务抢先修改了数据,就会导致多次读取的数据不一致 | - | 存在 | 存在 |
| 可重复读Repeatable read | 事务内多次读取的值,永远与首次读取到的值一致 | 事务执行过程中,若其它事务抢先修改了数据,则读到的值与真实值不一致 | - | - | 存在 |
| 串行化serializable | 所有的事务串起来一个个执行 | 无并发能力,性能低 | - | - | - |
单机事务的局限性
当业务扩展到分布式环境时,单机事务面临根本性挑战:
- 跨数据库操作:无法保证多个数据库的原子性
- 跨服务调用:业务逻辑分散在不同服务中
- 性能瓶颈:全局锁导致系统吞吐量下降
- 可用性风险:单点故障影响整个事务
分布式事务
分布式系统的理论基础:CAP
CAP理论是分布式计算领域的公认定理,即:一个分布式系统最多只能同时满足一致性、可用性和分区容错性这三项中的两项。
- 一致性(Consistency) :所有节点在同一时刻的数据是完全相同的
- 可用性(Availability) :系统提供的服务永远处于可用状态
- 分区容错性(Partition Tolerance) :因网络故障导致不连通时,不同子网络内的系统仍能正常工作
| 权衡 | 执行操作 | 场景 |
|---|---|---|
| CA | 既要保证数据的一致性(C),又要保证可用性(A),当发生网络分区时,系统必然不可用。 | 非分布式系统 |
| CP | 如果要保证数据的一致性(C),当发生网络分区时,就必须阻塞等待,此时必然牺牲可用性(A) | 支付系统,购票系统等 |
| AP | 如果要保证系统的可用性(A),当发生网络分区时,就不能阻塞等待,此时必然牺牲一致性(C) | 网站,日志系统等 |
分布式事务的基本特征:BASE
根据CAP理论,分布式系统需要在一致性和可用性之间作出权衡。
而传统的ACID本地事务特征是以保证强一致性为基础的。
那么针对分布式系统,出现了以保证最终一致性为基础的BASE事务特征:
- 基本可用(Basically Available) :故障时允许损失部分可用性。功能上适当做服务降级。
- 软状态(Soft State) :允许数据存在中间状态,即允许各个节点的数据同步存在延时。
- 最终一致性(Eventual Consistency) :在经过一段时间的同步之后,数据最终能够达成一致。
分布式事务的解决方案(保证强一致性)
两阶段提交
两阶段提交(2PC)是基于XA协议,采用集中式算法,定义了协调者(全局事务管理器)和参与者(本地资源管理器)两个角色。协调者作为控制中心只提供事务的协调工作,由参与者真正负责事务处理。
执行流程:
- 执行阶段: 协调者会要求所有参与者执行事务操作但不提交,所有参与者在执行完成后,反馈执行成功或失败消息。
- 提交阶段: 协调者会根据所有参与者的反馈结果,要求所有参与者执行提交或回滚操作,所有参与者执行后事务结束。
三阶段提交
三阶段提交(3PC)是对两阶段提交方案的改进,为了解决在发生故障时的同步阻塞问题和网络异常时的数据不一致问题,引入了超时机制并增加前置准备阶段。
新增的准备阶段,协调者会询问所有参与者是否已经准备好可以执行事务了,若某个参与者出现故障或超时无响应则不可执行。执行和提交阶段与两阶段提交类似,但加入了超时中断的处理机制。
虽然XA协议基本满足了事务的ACID特性,但依然有些不足:
- 同步阻塞问题: 由于两阶段提交的所有参与者都是同步阻塞的,因此一旦某个参与者出现故障,则可能会一直处于阻塞状态。优化方案是在三阶段提交引入了超时机制,在超时时自动中断事务。
- 数据不一致问题: 由于网络的不可靠性,若在最终提交阶段出现局部网络异常,就会导致一部份参与者提交了事务而另一部份参与者回滚了事务,从而出现数据不一致。优化方案是在三阶段提交引入了准备阶段,提前排除了大部份可能的故障。
- 单点故障问题: 由于两阶段提交和三阶段提交都使用了集中式算法,因此一旦协调者发生故障,则整个系统的事务均不可用。优化方案通常是通过引入集群来解决协调者的单点故障问题。
分布式事务的解决方案(保证最终一致性)
TCC协议方案
TCC(Try-Confirm-Cancel)分为执行(Try)和提交(Confirm or Cancel)两个阶段。它的特征在于与数据库解绑,事务过程完全由业务服务来实现,这样可以带来灵活性(如跨库事务)
执行流程:
- 事务发起者会先向DTM申请注册一个全局事务ID。
- 事务参与者执行事务
- 事务发起者将申请到的全局事务ID透传到所调用的事务参与者中。
- 事务参与者利用得到的全局事务ID,向DTM注册申请一个分支事务ID。
- 事务参与者完成自身业务逻辑(即完成TCC中的Try执行阶段)
- 事务参与者将自身业务逻辑执行结果上传到DTM,并示意本次分支事务结束。
- 其它的事务参与者执行事务
- 事务发起者在所有参与者均完成后,请求发起TCC二阶段。
- DTM根据全局事务ID,找到所有事务参与者,发起TCC二阶段。
- DTM通告事务发起者,全局事务结束。
架构优势:
- 业务灵活性高
- 避免长时间资源锁定
- 支持跨服务事务
实施挑战:
- 业务代码侵入性强(可利用TCC框架简化,如Seata)
- 业务方需要保证操作的幂等性(用于支持失败时重试)
- 处理边界情况复杂
异步消息方案
异步消息是以补偿机制作为核心思想,将需要分布式处理的事务通过消息或者日志的方式,暂时先存在消息中间件(文件、数据库、消息队列)中,再由业务系统异步执行。
- 异步消息方式通过异步调用和消息中间件,对强依赖关系进行解耦。
- 优点是无同步阻塞和单点故障问题,且执行性能高。
- 缺点是并不保证消息的强一致性,仅确保在一定时间后数据最终达成一致。
- 由于异步消息模式会有消息丢失等可靠性问题,因此实际场景中通常会基于异步消息进行改良,实现如补偿模式,可靠事件模式,最大努力通知模式等。
技术选型指南
没有完美的分布式事务解决方案,需要根据场景在一致性、可用性、性能之间做出合理的权衡选择。
| 方案 | 数据一致性 | 性能 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| 2PC/3PC | 强一致 | 低 | 中 | 金融核心交易 |
| TCC | 最终一致 | 中 | 高 | 复杂业务流程 |
| 消息队列 | 最终一致 | 高 | 中 | 高并发互联网业务 |
总结与未来展望
未来发展趋势
新硬件技术影响
RDMA网络技术
- 技术简介:RDMA(Remote Direct Memory Access)允许网络中的计算机直接访问另一台计算机的内存,无需操作系统内核参与,大幅减少数据复制和上下文切换开销。
- 在分布式事务中的应用:通过RDMA技术,分布式事务中的协调者和参与者之间的通信延迟可从毫秒级降低到微秒级,使得两阶段提交等强一致性方案的性能瓶颈得到显著改善。例如,基于RDMA的分布式事务系统可以实现近乎本地事务的性能表现。
持久内存(PMEM)
- 技术简介:持久内存如Intel Optane PMEM,兼具内存的高速特性和存储的持久化能力,数据在断电后不会丢失。
- 在分布式事务中的应用:持久内存可以用于存储事务日志和状态信息,避免了传统的磁盘I/O瓶颈。事务协调者可以将预提交日志直接写入持久内存,大幅减少提交阶段的等待时间,同时保证故障恢复的可靠性。
智能网卡与DPU
- 技术简介:智能网卡和DPU(Data Processing Unit)将部分计算任务从CPU卸载到网卡上处理,专门优化网络和数据传输。
- 在分布式事务中的应用:分布式事务的协调逻辑可以部分卸载到智能网卡上执行,包括消息排序、超时检测、事务状态维护等,释放CPU资源处理业务逻辑。这种架构特别适合高频交易、实时计费等对性能要求极高的场景。
算法理论突破
新一致性模型
- 技术简介:介于强一致性和最终一致性之间的折中一致性模型,如因果一致性、会话一致性、读写一致性等,在保证正确性的同时提供更好的性能。
- 在分布式事务中的应用:针对不同业务场景选择合适的一致性级别,如电商库存查询可采用最终一致性,而资金余额查询需要强一致性。新型混合一致性模型允许在同一系统中对不同数据采用不同的一致性保证。
机器学习优化
- 技术简介:利用机器学习算法分析历史事务数据,预测事务冲突概率、最优超时时间、资源竞争模式等。
- 在分布式事务中的应用:系统可以根据预测结果动态调整事务参数,如预判可能发生冲突的事务并提前分配资源,或者根据负载模式自动调整锁超时时间。基于强化学习的事务调度器可以学习最优的并发控制策略。
形式化验证
- 技术简介:使用数学方法严格证明分布式协议的正确性,如TLA+、Coq等形式化验证工具。
- 在分布式事务中的应用:对核心分布式事务算法进行数学证明,确保在各类边界条件下都能保持正确性。这对于金融、航空等安全关键领域的分布式系统尤为重要,可以避免基于测试的传统验证方法可能遗漏的极端情况。
云原生集成
服务网格
- 技术简介:Service Mesh作为微服务通信的基础设施层,处理服务间的网络通信,如Istio、Linkerd等。
- 在分布式事务中的应用:在Service Mesh层面提供分布式事务能力,业务代码无需显式处理事务逻辑。通过sidecar代理拦截服务调用,自动处理事务上下文传播、超时重试、补偿操作等,实现业务逻辑与事务控制的解耦。
无服务器计算****架构
- 技术简介:Serverless架构中开发者只关注业务函数,无需管理服务器基础设施。
- 在分布式事务中的应用:事件驱动的分布式事务模式天然适合Serverless架构。通过事件总线和函数流水线构建分布式事务,每个函数处理事务的一个步骤,通过Saga模式协调整个事务流程。这种模式特别适合数据ETL、批量处理等场景。
多云部署
- 技术简介:业务系统同时部署在多个云厂商的平台,避免供应商锁定并提高容灾能力。
- 在分布式事务中的应用:跨云分布式事务协调器可以屏蔽底层基础设施差异,在AWS、Azure、Google Cloud等不同云环境间协调事务。基于标准协议(如HTTP、gRPC)和统一的事务标识,实现真正的多云事务一致性。
开发者体验提升
声明式事务
- 技术简介:通过注解或配置声明事务边界,而非在代码中显式控制事务。
- 在分布式事务中的应用:开发者只需在方法上添加事务注解,框架自动处理分布式事务的开启、提交、回滚。新一代框架还支持基于代码静态分析自动推断事务边界,进一步减少开发工作量。
自动化工具
- 技术简介:智能识别微服务调用链路中的事务边界,自动生成补偿逻辑和重试机制。
- 在分布式事务中的应用:工具链分析服务依赖关系和数据流向,推荐最优的事务方案。对于已有系统,自动化重构工具可以将本地事务升级为分布式事务,保持业务逻辑不变的同时获得分布式事务能力。
可视化调试
- 技术简介:图形化展示分布式事务的完整执行链路,包括各参与者的状态、数据流向、依赖关系等。
- 在分布式事务中的应用:开发者可以直观查看分布式事务的执行过程,快速定位超时、死锁、数据不一致等问题。可视化工具还支持事务回放,重现问题发生的完整场景,大幅提升分布式系统的调试效率。
架构演进思考
分布式事务技术的发展正朝着智能化、透明化、专业化三个方向演进:
- 智能化:通过AI和机器学习技术,使分布式事务系统具备自感知、自决策、自优化的能力,能够根据实际运行状况动态调整策略。
- 透明化:通过基础设施层的改进,让分布式事务对业务开发者越来越透明,开发者可以像编写单机事务一样编写分布式事务代码。
- 专业化:针对不同行业和场景的特殊需求,出现更加专业化的分布式事务解决方案,如金融级强一致性事务、物联网边缘计算事务等。
这些技术趋势共同推动着分布式系统向更可靠、更高效、更易用的方向发展,为构建下一代互联网应用奠定坚实基础。