事务实现的底层原理
1.Undo Log(回滚日志)
- 作用:
- Undo Log 主要用于事务回滚和 MVCC(多版本并发控制)。
- 在 MVCC 中,Undo Log 提供了数据的历史版本,保证了事务读取数据时的一致性。
- 它记录了数据修改前的状态,当事务执行失败或者需要回滚时,可以使用 Undo Log 将数据恢复到事务开始之前的状态。
- 存储:
- Undo Log 通常存储在单独的日志文件中。
- 每个事务执行的修改操作都会被记录到 Undo Log。
- 原理:
- 当事务对数据进行修改时,会先将修改前的数据写入 Undo Log,然后再执行修改操作。
- 如果事务回滚,则数据库可以使用 Undo Log 中记录的操作的反向操作,将数据恢复到事务开始之前的状态。
- 如果事务提交,则 Undo Log 可以被删除或重用。
2. Redo Log(重做日志):
- 作用:
- Redo Log 主要用于保证事务的持久性。
- 即使数据库发生崩溃,也可以通过 Redo Log 将未持久化的数据恢复。
- 当事务提交时,会先将事务的修改记录写入 Redo Log,然后再异步写入磁盘。
- 存储:
- Redo Log 通常存储在单独的循环写入的日志文件中,固定大小。
- 原理:
- 当事务对数据进行修改时,会先将修改操作写入 Redo Log,然后才修改内存中的数据页。
- 如果系统崩溃了,会在重启的时候,回放 Redo log,恢复数据。
- 当数据页被刷新到磁盘时,Redo Log 中对应的记录会被标记为已完成。
- Redo Log 采用了预写日志(Write Ahead Logging)技术,保证了事务的持久性。
3.锁机制
- 作用:
- 锁机制用于控制并发事务之间对数据的访问,保证事务的隔离性。
- 不同的锁类型,例如行锁、表锁、共享锁、排他锁等,用于实现不同的并发控制策略。
- 实现:
- 当事务需要读取或修改数据时,会先尝试获取相应的锁。
- 当事务执行完成后,会释放持有的锁。
- 如果锁被其他事务占用,则当前事务需要等待。
4.MVCC(多版本并发控制):
- 作用:
- MVCC 用于提高并发事务的性能,避免使用过多的锁。
- MVCC 通过维护数据的多版本,使得不同的事务可以读取到不同版本的数据。
- 实现:
- 每个事务启动时,会创建一个
Read View
,用来记录当前事务启动时,其他活跃事务的信息。 - 事务读取数据时,会根据自身的
Read View
和数据的版本信息来判断是否可以看到该版本的数据。
5.事务管理器:
- 作用:
- 事务管理器负责协调事务的执行、提交和回滚。
- 它会记录事务的状态,并且会保证事务的ACID特性。
- 实现:
- 通过对 undo log 和 redo log 进行操作,完成事务的回滚和提交操作
6.总结:
- 事务的底层原理涉及 Undo Log、Redo Log、锁机制、MVCC 和事务管理器等多个关键组件。
- Undo Log 用于事务回滚和 MVCC,Redo Log 用于保证事务的持久性,锁机制用于控制并发访问,MVCC 用于提高并发性能。
- 这些机制共同作用,保证了事务的 ACID 特性,确保数据库的可靠性和数据的一致性。