找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3714

积分

0

好友

520

主题
发表于 8 小时前 | 查看: 3| 回复: 0

一、什么是事务?

想象一个生活中的场景:你去小卖铺买东西,“一手交钱,一手交货”就构成了一个简单的事务。交钱和交货这两个活动必须全部成功,整个交易才算完成;如果任何一个环节失败,比如钱没付出去或者货没拿到,那么整个交易就需要撤销,恢复到最初的状态。

在计算机领域,事务可以被看作一个由多个小活动组成的大活动。这些活动遵循一个核心原则:要么全部成功,要么全部失败,不存在中间状态。

二、理解本地事务

在软件系统中,事务通常由关系型数据库来管理和控制。它利用数据库自身提供的事务特性来实现,因此常被称为数据库事务。由于数据库和应用服务器往往部署在同一台机器上,所以也被称为本地事务

一个典型的例子是银行转账:张三向李四转账100元。
这个过程天然地需要满足数据库事务的四大特性,即 ACID

  • A (Atomic) - 原子性:构成事务的所有操作是一个不可分割的整体。它们要么全部执行成功,要么全部不执行,不可能出现部分成功、部分失败的情况。
  • C (Consistency) - 一致性:事务执行前后,数据库必须保持一致的状态,所有预设的数据约束都不会被破坏。在转账场景中,转账前和转账后,张三和李四的账户总额应当保持不变。如果张三扣了100元而李四没收到,就破坏了数据一致性。
  • I (Isolation) - 隔离性:当多个事务并发执行时,一个事务的执行不应影响其他事务。每个事务都感觉不到其他事务在同时运行。数据库通过设置不同的事务隔离级别(如读已提交、可重复读)来避免脏读、不可重复读等问题。
  • D (Durability) - 持久性:一旦事务提交成功,它对数据库所做的更改就是永久性的,即使系统发生故障也不会丢失。

数据库在实现本地事务时,会将事务涉及的所有数据库操作捆绑成一个不可分割的执行单元。这个单元内的操作同生共死。用伪代码表示上述转账过程如下:

begin transaction;
//1.本地数据库操作:张三减少金额
//2.本地数据库操作:李四增加金额
commit transation;

三、什么是分布式事务?

随着互联网架构的演进,单体应用逐渐被拆分为可独立部署的多个服务,形成了微服务或分布式架构。

微服务架构与交互示意图

在这种架构下,完成一个业务功能往往需要多个服务之间通过网络进行远程协作。由不同的服务通过网络远程协作完成的事务,就称为分布式事务

常见的分布式事务场景包括:

  • 用户注册成功并赠送积分
  • 下单成功后扣减商品库存
  • 跨行或跨账户的银行转账

此时,我们的转账伪代码就变成了这样(注意第二行变成了远程调用):

begin transaction;
//1.本地数据库操作:张三减少金额
//2.远程调用:让李四增加金额
commit transation;

思考一下这里可能出现的问题:如果远程调用让李四账户增加金额的操作实际上成功了,但由于网络延迟或故障,调用结果没有及时返回。此时,本地事务因超时等原因判定失败并回滚,导致张三的扣款操作被撤销。最终结果是:李四的钱多了,张三的钱没少,数据严重不一致。

因此,在分布式架构下,传统的、基于单一数据库连接的本地事务机制失效了。因为参与事务的资源(如张三和李四的账户)可能分布在不同的数据库、甚至不同的应用中,只能通过远程调用来协调,而网络的不确定性正是分布式事务复杂性的根源。

四、分布式事务产生的典型场景

  1. 跨JVM进程:这是微服务架构下的典型场景。例如,订单服务调用库存服务进行扣减库存操作。
    订单服务调用库存服务示意图

  2. 跨数据库实例:即使在同一个应用内,如果业务需要操作多个不同的数据库实例,也会产生分布式事务。例如,用户管理系统需要同时删除存储在MySQL实例A中的用户基本信息和存储在MySQL实例B中的用户积分信息。
    用户服务操作多个数据库实例示意图

  3. 多服务访问同一数据库:即使订单服务和库存服务都连接同一个MySQL数据库,只要它们是两个独立的JVM进程,各自持有不同的数据库连接,那么它们对数据库的操作也属于分布式事务范畴。因为事务的上下文无法通过单一的数据库连接来管理。
    多服务访问同一数据库示意图

五、分布式系统基础理论:CAP定理

CAP定理是分布式系统领域一个奠基性的理论,它指出,一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)这三项中的两项。

为了便于理解,我们结合一个电商商品信息管理的主从数据库架构来分析:
数据库主从复制架构示意图

流程如下:

  1. 商品服务向主库(Master)写入商品信息。
  2. 主库写入成功并响应商品服务。
  3. 商品服务向从库(Slave)读取商品信息。

C - 一致性 (Consistency)
指数据在多个副本之间能否保持一致的特性。即,执行一次更新操作后,所有后续的读操作都应该读到最新的数据状态。在上图中,要实现一致性:

  • 写入主库的数据必须同步到从库。
  • 在数据同步期间,可能需要锁定从库(或从库的对应数据行),防止读到旧数据,待同步完成后再解锁。

一致性的特点

  • 存在数据同步过程,导致写操作的响应会有延迟。
  • 可能需要对资源加锁,影响并发性能。
  • 如果请求访问到未同步最新数据的节点,系统应返回错误,而非旧数据。

A - 可用性 (Availability)
指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求,系统总能在有限时间内返回结果(不一定是成功的结果)。在上图中,要实现高可用性:

  • 不能因为要保证数据一致性而长时间锁定从库资源,否则会影响查询服务的可用性。
  • 即使从库数据未同步完成,也应返回数据(可以是稍旧的版本或默认值),绝不能返回错误或超时。

可用性的特点

  • 所有请求都必须得到响应(成功或失败提示),不能无限期挂起。

P - 分区容错性 (Partition Tolerance)
分布式系统通常部署在多台机器或不同子网中,网络分区(即节点间无法正常通信)是不可避免的。分区容错性要求,即使系统中有部分节点因网络问题无法通信,系统整体依然能够继续对外提供服务。在上图中,这意味着:

  • 主从同步失败不应影响主库的写服务和从库的读服务。
  • 其中一个数据库节点宕机,另一个节点应能继续工作。

分区容错性的特点

  • 这是分布式系统必须面对和解决的问题,是分布式系统的“天性”之一。

CAP的组合与取舍
CAP定理的精髓在于“三者不可兼得”。在保证分区容错性(P)的前提下,一致性和可用性无法同时达到最优。

CAP定理示意图

在实际的系统架构设计中,我们需要根据业务需求做出选择:

  1. AP (放弃强一致性,保证可用性和分区容错性):这是许多互联网分布式系统的选择。它们不要求数据的实时强一致,但要求服务永远可用。通常会采用最终一致性模型。例如,订单退款操作,允许“今日申请退款,明日到账”;或者像Redis的分布式锁实现(如SETNX命令),就是典型的AP模型。
  2. CP (放弃可用性,保证一致性和分区容错性):为了数据的强一致性,愿意牺牲部分可用性。例如,ZooKeeper在选举Leader期间会拒绝写入请求,保证数据一致性。跨行转账也类似,必须双方银行的系统都处理成功,事务才算完成,期间请求可能处于等待状态。
  3. CA (放弃分区容错性,保证一致性和可用性):这实际上意味着放弃“分布式”,将所有数据和服务集中在一起,避免网络分区问题。传统的关系型数据库(如单机MySQL)就是CA系统,这也是单体架构的特点。

六、BASE理论

由于在分布式系统中完全满足ACID成本极高,且常常与可用性目标冲突,BASE理论应运而生。它是对CAP定理中AP方案的进一步扩展和细化。

BASE 由以下三部分组成:

  • Basically Available (基本可用):分布式系统出现故障时,允许损失部分非核心功能的可用性,但要保证核心功能的可用。例如,电商网站在大促时,可以关闭商品评价功能来保证下单、支付核心链路的稳定。
  • Soft State (软状态):允许系统数据存在中间状态,并且认为该状态不会影响系统整体可用性。这个状态是暂时的,最终会趋于一致。例如,订单的“支付中”、数据“同步中”等状态。
  • Eventually Consistent (最终一致性):系统不需要保证数据的实时强一致性,但承诺在经过一段时间的同步(可能存在延迟)后,所有副本的数据最终会达到一致的状态。例如,订单的“支付中”状态,最终会变成“支付成功”或“支付失败”。

遵循BASE理论的事务通常被称为 “柔性事务”。它通过牺牲强一致性,换取了系统的高可用性和可扩展性。

总结

CAP定理和BASE理论为我们进行分布式系统架构设计和技术选型提供了根本性的指导原则。

对于大多数大型互联网应用而言,节点众多、网络环境复杂,节点或网络故障是常态。同时,业务上要求服务必须保持极高的可用性(如99.99%),并具有良好的响应性能。因此,常见的架构选择是:保证分区容错性(P)和可用性(A),舍弃强一致性(C),采用最终一致性模型

理解这些基础理论,是学习和实践各类具体分布式事务解决方案(如2PC、TCC、Saga、消息队列事务消息等)的基石。在云栈社区,你可以找到更多关于这些具体技术实现的深入讨论和案例分析。




上一篇:如何设计承载美团百亿级消息的系统:高并发架构核心方案解析
下一篇:干货解析:分布式存储系统 FastDFS 架构、工作原理与核心问题思考
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-3 20:15 , Processed in 0.421210 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表