Skip to content

选择一个 ACID 特性来介绍

约 763 字大约 3 分钟

MySQL小红书

2025-03-14

⭐ 题目日期:

小红书 - 2024/11/11

📝 题解:

原子性(Atomicity)

定义 原子性是 ACID 事务特性的核心原则之一,确保事务中的所有操作要么全部成功提交,要么全部失败回滚,不存在“部分成功”的状态。事务的原子性类似于物理世界中的原子概念——不可分割的最小单位。如果事务中的任何一个操作失败,整个事务将被回滚到初始状态,就像从未执行过一样。


示例场景

假设银行转账事务包含两个操作:

  1. 从账户 A 扣除 100 元。
  2. 向账户 B 增加 100 元。

原子性的作用

  • 若两个操作均成功,事务提交,资金完成转移。
  • 若任意一步失败(如账户 A 余额不足或系统崩溃),事务会回滚:
    • 账户 A 的扣款撤销,账户 B 的加款撤销。
    • 数据库保持转账前的状态,避免数据不一致(如账户 A 扣款成功但账户 B 未到账)。

实现原理

数据库通过以下机制保障原子性:

  1. 日志(Undo Log)
    1. 事务执行前,数据库记录原始数据的快照(undo log)。
    2. 若事务失败,根据 undo log 回滚所有修改。
  2. 两阶段提交(2PC)(分布式场景):
    1. 协调者先询问所有参与者是否可提交,收到确认后再发送最终提交指令。
    2. 任一参与者失败,所有参与者回滚。

原子性的重要性

  1. 数据一致性:防止因部分操作失败导致的“半完成”状态(如扣款成功但未到账)。
  2. 容错能力:系统崩溃、网络中断等异常场景下,确保数据恢复后的一致性。
  3. 业务可靠性:关键业务逻辑(如支付、订单)依赖原子性保障完整性。

与其他 ACID 特性的关系

  • 一致性(Consistency:原子性是实现一致性的基础。若事务不满足原子性,数据库可能处于违反业务规则的状态。
  • 隔离性(Isolation):多个事务并发执行时,原子性确保每个事务独立生效,不受其他事务干扰。

实际应用注意事项

  1. 显式控制事务边界
    1. 在代码中明确标记事务的开始(BEGIN)和结束(COMMIT/ROLLBACK)。
  2. 避免长事务
    1. 长时间未提交的事务会占用资源,增加锁竞争和回滚成本。
  3. 分布式事务挑战
    1. 跨数据库或微服务的事务需借助 Saga 模式、TCC(Try-Confirm-Cancel)等方案实现原子性。

总结

原子性是事务的“全或无”特性,确保数据库在复杂操作或异常场景下始终保持逻辑完整性。它不仅是数据库设计的基石,也是构建可靠分布式系统的关键挑战之一。