事务
事务的特性
- Atomicity-原子性
- 事务内的操作要么全部成功,要不全部不成功
- Consistency-一致性
- 事务提交前后符合数据库的数据时一致
- Isolation-隔离性
- 事务之间是相互隔离,互不影响
- Durability-持久性
- 事务一旦提交,无法改变
事务的状态
活动的、部分提交的、提交的、失败的、中止的
事务的语法
1 | ## 开启事务 |
- 隐式事务
- 保存点-savepoint
Redo 重做日志
在执行事务的过程中,每执行一条语句,就有可能产生若干条 redo 日志
redo 日志格式
- type:日志类型
- Space ID:表空间 ID
- page number:页号
- data:具体内容
redo 日志会把事务在执行过程中对数据库所做的所有修改都记录下来,在之后系统奔溃重启后可以把事务所做的任何修改都恢复出来。
Mini-Transaction
以组的形式写入 redo 日志
以下情况组不可分割
- 更新
Max Row ID
属性时产生的redo
日志是不可分割的。 - 向聚簇索引对应
B+
树的页面中插入一条记录时产生的redo
日志是不可分割的。 - 向某个二级索引对应
B+
树的页面中插入一条记录时产生的redo
日志是不可分割的。 - 还有其他的一些对页面的访问操作时产生的
redo
日志是不可分割的。。。
redo 日志的写入过程
redo log block
Redo 日志缓冲区 512KB 的 block
redo 日志的刷盘时机
redo 日志文件组
Checkpoint:redo 日志只是为了系统奔溃后恢复脏页用的,如果对应的脏页已经刷新到磁盘,那么相对应的 redo 日志就不需要了(通过更新 flush 链表)checkpoint_lsn 增加的形式来标识可以被覆盖的 redo 日志。
Log Sequeue Number:日志序列号(lsn)
日志首选写入到log_buffer
中,之后才会被刷新到磁盘上的 redo 日志文件。通过flushed_to_disk_lsn
参数来刷新,初始值未lsn
的初始值8704。
奔溃恢复
- 确认恢复的起点:redo 日志文件组的第一个文件的管理信息中有两个 block 中选出 checkpoint_no 比较大的对应的 checkpoint_lsn 对应的 redo 日志的 checkpoint_offset
- 确认恢复的终点:
log clock header
中的LOG_BLOCK_HDR_DATA_LEN
的属性,该属性记录了当前 block 里面使用了多少字节的空间, 未被填满的永远为 512 - 如何恢复:
- 使用哈希表,根据 redo 日志的
space ID
和page number
属性计算出散列值(可以算出相同的页),多个相同的散列值(槽)之间使用链表连接
- 使用哈希表,根据 redo 日志的