🌈键盘敲烂,年薪30万🌈
- 👀再来一遍ACID
1. 原子性:原子性确保事务作为一个整体执行,要么全部执行成功,要么全部不执行。
2. 一致性:一致性确保事务将数据库从一个状态转换为另一个状态。
3. 隔离性:隔离性确保并发执行的多个事务互相隔离。
4. 持久性:事务一旦提交,其修改将永远保存在数据库中。
一、log日志文件
📕 事务执行流程
- 为什么会有日志❓
先说结论:
数据库日志的存在是为了确保事务的持久性,支持故障恢复和并发控制,并提供回滚、撤销以及备份和恢复的功能。日志记录了对数据库的操作,使得数据库系统能够有效地管理数据的修改和恢复。
- 确保持久性❓ 难道没有日志事务提交后可能出现数据不一致❓
分析:
执行事务->判断内存中有无数据->(加载磁盘数据到内存)->事务提交->日志保存到磁盘
问题1:刷新数据时机?
系统会根据负载情况和性能优化的考虑来决定脏数据刷新的时机和方式。
问题2:为什么不能提交完事务,直接将Buffer Pool数据保存到磁盘文件?
我们平时操作的数据库都是随机的,也就意味着随机访问磁盘文件,这会大量占用I/O,性能很低。但是,日志是以追加的方式写入,是顺序访问磁盘文件,性能高的很。
WAL机制:
Writer - Ahead - Logging: 先记录日志在刷新脏数据
小结:
了解了事务的执行流程在看日志就比较简单了,无非就是两种记录方式。
📕 redo log
- 重做日志,记录事务提交时对数据页的操作,从而实现事务的持久性。
redo log buffer:内存中的数据库数据。
redo log file:磁盘中的数据库数据。
📕 undo log
又称回滚日志,用于记录被修改前的信息,作用有两个,回滚事务,MVCC。它可以保障事务的原子性
注意:
Undo log记录的数据是反向的,比如执行一条delete语句,undo log保存一条insert语句,回滚就是读取undo log中的sql语句,再比如执行update语句,undo log会保存update前的数据库状态。
Undo log销毁:事务提交后不会立刻销毁日志,因为这些日志可能用于MVCC
Undo log存储:采用段的方式进行管理和记录(这里不太懂)
二、总结
redo log保证了事物的持久性
undo log保证了事务的原子性
redo log + undo log保证了事务的一致性
MVCC+锁保证了事务的隔离性(下一篇)