本文共 1971 字,大约阅读时间需要 6 分钟。
ACID特性的实现原理
背景:什么是事务
在数据库系统中,事务是一组SQL操作,这组操作要么全部成功完成,要么全部失败 rollback。例如,转账操作需要扣除转出账户的金额并增加转入账户的金额,这两步操作必须同时成功或同时失败,否则数据可能处于不一致的状态,影响数据的完整性和一致性。
事务的作用
可靠性:保证数据库在面对异常或服务器 crash时,能够回滚未提交的修改,确保数据的一致性。 并发处理:允许多个事务并发执行,同时保证事务之间不会互相干扰,避免读取到未提交的修改数据(脏读)。 隔离性:确保不同事务之间的操作不会互相影响,提供数据的一致性。 实现事务的三大关键技术包括:
undo log(回滚日志):用于回滚事务-executed操作。 redo log(重做日志):用于持久化确保修改已写入磁盘。 锁机制:用于控制并发访问,防止数据竞争。
ACID特性
ACID是事务管理的四个核心特性,以下从原子性、持久性、隔离性和一致性四个方面详细分析。
1. 原子性(Atomicity)
原子性要求所有操作要么全部成功要么全部失败。这意味着如果在事务执行过程中出现错误或服务器 crash,所有已执行的修改都需要回滚至初始状态。
实现 principle:
- 基于undo log日志记录事务操作的详细信息。
- 当需要回滚时,undo log日志会被用来撤销已执行的修改,恢复数据到事务开始前的状态。
特点:
- 不能分割,整个事务是一个不可拆分的单元。
- 确保数据的完整性和一致性。
2. 持久性(Durability)
持久性要求一旦事务提交,所有修改将被永久保存到磁盘中,确保即使服务器 crash也不会丢失数据。
实现 principle:
- 使用 redo log 预写式日志技术。
- 修改操作先记录在 redo log日志中,然后更新到 buffer pool。
- 事务提交时,调用 fsync 操作将 redo log内容刷写到磁盘。
特点:
- 数据的持久化确保一致性,即使系统崩溃也能恢复。
- Duplicate data 保持不变,确保事务结果的可靠性。
3. 隔离性(Isolation)
隔离性确保存在任何时候只有一个事务能够修改数据库中的数据,防止数据未提交前被其它事务读取(脏读)。
实现 principle:
- 基于锁机制和 MVCC(多版本并发控制)。
- 锁机制确保数据独占性,MVCC通过隐藏列和版本控制避免读取未提交的数据。
隔离级别:
- InnoDB默认隔离级别为可重复读(RR),其优点是兼通性和性能,缺点是无法完全防止幻读。
- 更高的隔离级别(如可串行化 Serializable)虽然防止了幻读,但开销较大,通常不适用于高并发场景。
4. 一致性(Consistency)
一致性要求事务执行前后数据库状态保持一致,整个数据库处于合法状态。
实现 principle:
- 数据库内部约束(如主键、外键、索引等)和业务逻辑约束共同保证一致性。
- 事务的原子性、持久性和隔离性都是确保一致性的基石。
示例:
- 转账操作前后,转出账户余额减少,转入账户余额增加。
原子性详解
undo log(回滚日志)
undo log是实现原子性的核心技术,用于记录和撤销事务操作的日志。
作用:
- 记录事务修改的所有细节,如修改的行、列及之前值。
- 在事务回滚时,根据这些日志恢复数据到未修改状态。
示例:
- 更新操作:undo log记录修改后的值和旧值。
- 插入操作:undo log记录插入的行。
redo log(重做日志)
redo log用于持久化,确保数据写入磁盘。
特点:
- 基于预写式日志技术,所有修改先写入 redo log,然后才更新到 buffer pool。-刷脏(写入磁盘)通过 fsync 调用,确保数据持久化。
隔离性详解
锁机制
InnoDB支持多种锁粒度,如行锁、表锁、页锁。默认情况下,InnoDB优先使用行锁,以提高并发 performance。
锁类型:
行锁:只锁定被修改的行,资源利用率高。 表锁:锁定整个表,资源利用率低。 页锁:锁定数据页,粒度介于行锁和表锁之间。 MVCC(多版本并发控制)
MVCC通过隐藏列和版本号管理事务,并发读写,避免脏读和幻读。
隐藏列:
版本号:
- 每次修改数据时,附加一个新的版本号。
- 阅读操作根据版本号判断数据的修改版本,从而避免读取未提交的修改。
总结
ACID特性是数据库事务管理的核心机制,涵盖了数据操作的可靠性、最终一致性和原子性等关键点。通过 undo log、redo log、锁机制和 MVCC 等技术的结合,InnoDB 存储引擎能够高效地实现 ACID 特性,支持大规模的并发操作并保证数据的安全性和一致性。
转载地址:http://rpuiz.baihongyu.com/