ACID 是事务的四大核心特性,确保数据库操作的可靠性和一致性:
(1) 原子性(Atomicity)
- 定义:事务是一个不可分割的最小操作单元,要么全部成功,要么全部失败回滚。
- 实现机制:
- Undo Log(回滚日志):记录事务修改前的数据旧版本,用于回滚时恢复原始状态。
- 事务回滚流程:
BEGIN; UPDATE accounts SET balance = balance - 100 WHERE user = 'A'; -- 操作1 UPDATE accounts SET balance = balance + 100 WHERE user = 'B'; -- 操作2 -- 若此时系统崩溃,重启后通过 Undo Log 撤销未提交的操作1和操作2 COMMIT;
- 示例:转账操作中,扣款和加款必须同时成功或失败。
(2) 一致性(Consistency)
- 定义:事务执行后,数据库从一个一致状态转换到另一个一致状态(如数据完整性约束不被破坏)。
- 实现机制:
- 数据库约束:通过主键、外键、唯一约束、检查约束等保证数据合法性。
- 业务逻辑:应用层需确保事务逻辑符合业务规则(如余额不能为负数)。
- 示例:转账前后,账户总金额应保持不变(A-100,B+100)。
(3) 隔离性(Isolation)
-
定义:并发事务之间互不干扰,每个事务感觉不到其他事务在并行执行。
-
隔离级别:
级别 脏读 不可重复读 幻读 实现方式 读未提交 ✅ ✅ ✅ 无锁,直接读最新数据。 读已提交 ❌ ✅ ✅ 快照读(MVCC)或行锁。 可重复读(默认) ❌ ❌ ✅ MVCC + 间隙锁(InnoDB)。 串行化 ❌ ❌ ❌ 全表锁,强制事务串行执行。 -
问题说明:
- 脏读:读到其他事务未提交的数据。
- 不可重复读:同一事务内多次读取同一数据,结果不一致(因其他事务修改)。
- 幻读:同一事务内多次查询,结果集行数变化(因其他事务插入/删除)。
(4) 持久性(Durability)
- 定义:事务提交后,修改永久保存,即使系统崩溃也不丢失。
- 实现机制:
- Redo Log(重做日志):记录事务修改后的数据新版本,按顺序写入磁盘。
- 刷盘策略:
-
参数
innodb_flush_log_at_trx_commit的取值及含义:值 行为 持久性 性能 1 每次事务提交时,将 Redo Log 写入磁盘( fsync)最高(崩溃不丢数据) 最低 0 每秒将 Redo Log 写入磁盘(后台线程刷盘) 可能丢失最多1秒数据 最高 2 每次事务提交时将 Redo Log 写入操作系统缓存,由系统决定何时刷到磁盘 可能丢失操作系统崩溃 中等 -
默认值:
innodb_flush_log_at_trx_commit=1(即策略1:每次提交刷盘)。
这是 MySQL 的默认配置,确保事务提交后数据持久化到磁盘,符合 ACID 的持久性要求。
-
- 示例:事务提交后,即使断电,重启后通过 Redo Log 重放恢复数据。
ACID 是事务的基石,通过 Undo Log(原子性)、约束(一致性)、锁与 MVCC(隔离性)、Redo Log(持久性)实现。
281

被折叠的 条评论
为什么被折叠?



