事务

事务的特性

  • Atomicity-原子性
    • 事务内的操作要么全部成功,要不全部不成功
  • Consistency-一致性
    • 事务提交前后符合数据库的数据时一致
  • Isolation-隔离性
    • 事务之间是相互隔离,互不影响
  • Durability-持久性
    • 事务一旦提交,无法改变

事务的状态

活动的、部分提交的、提交的、失败的、中止的

事务的语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 ## 开启事务
 BEGIN;
 START TRANSACTION;
 ## 只读事务
 START TRANSACTION READ ONLY;
 ## 读写事务
 START TRANSACTION READ WRITE
 ## 一致性读
 START TRANSACTION WITH CONSISTENT SNAPSHOT
 ## 提交事务
 COMMIT;
 ## 手动中止事务
 ROLLBACK;
 ## 隐式事务
 
  • 隐式事务
  • 保存点-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 IDpage number属性计算出散列值(可以算出相同的页),多个相同的散列值(槽)之间使用链表连接