外观
选择一个 ACID 特性来介绍
⭐ 题目日期:
小红书 - 2024/11/11
📝 题解:
原子性(Atomicity)
定义 原子性是 ACID 事务特性的核心原则之一,确保事务中的所有操作要么全部成功提交,要么全部失败回滚,不存在“部分成功”的状态。事务的原子性类似于物理世界中的原子概念——不可分割的最小单位。如果事务中的任何一个操作失败,整个事务将被回滚到初始状态,就像从未执行过一样。
示例场景
假设银行转账事务包含两个操作:
- 从账户 A 扣除 100 元。
- 向账户 B 增加 100 元。
原子性的作用:
- 若两个操作均成功,事务提交,资金完成转移。
- 若任意一步失败(如账户 A 余额不足或系统崩溃),事务会回滚:
- 账户 A 的扣款撤销,账户 B 的加款撤销。
- 数据库保持转账前的状态,避免数据不一致(如账户 A 扣款成功但账户 B 未到账)。
实现原理
数据库通过以下机制保障原子性:
- 日志(Undo Log):
- 事务执行前,数据库记录原始数据的快照(undo log)。
- 若事务失败,根据 undo log 回滚所有修改。
- 两阶段提交(2PC)(分布式场景):
- 协调者先询问所有参与者是否可提交,收到确认后再发送最终提交指令。
- 任一参与者失败,所有参与者回滚。
原子性的重要性
- 数据一致性:防止因部分操作失败导致的“半完成”状态(如扣款成功但未到账)。
- 容错能力:系统崩溃、网络中断等异常场景下,确保数据恢复后的一致性。
- 业务可靠性:关键业务逻辑(如支付、订单)依赖原子性保障完整性。
与其他 ACID 特性的关系
- 一致性(Consistency):原子性是实现一致性的基础。若事务不满足原子性,数据库可能处于违反业务规则的状态。
- 隔离性(Isolation):多个事务并发执行时,原子性确保每个事务独立生效,不受其他事务干扰。
实际应用注意事项
- 显式控制事务边界:
- 在代码中明确标记事务的开始(
BEGIN
)和结束(COMMIT
/ROLLBACK
)。
- 在代码中明确标记事务的开始(
- 避免长事务:
- 长时间未提交的事务会占用资源,增加锁竞争和回滚成本。
- 分布式事务挑战:
- 跨数据库或微服务的事务需借助 Saga 模式、TCC(Try-Confirm-Cancel)等方案实现原子性。
总结
原子性是事务的“全或无”特性,确保数据库在复杂操作或异常场景下始终保持逻辑完整性。它不仅是数据库设计的基石,也是构建可靠分布式系统的关键挑战之一。