InnoDB如何实现事务、undo log、redo log、binlog

2023-05-05 20:08:40 浏览数 (1)

InnoDB如何实现事务、undo log、redo log、binlog

InnoDB是MySQL的默认存储引擎,它使用多版本并发控制(MVCC)和锁机制来实现事务。

多版本并发控制(MVCC)

InnoDB使用MVCC来实现隔离性。它会为每一行数据维护两个数据版本:

  • 读数据版本(Read View):事务开始时读取的行版本。
  • 当前数据版本(Current View):数据的最新版本。当事务读取数据行时,它会读取读数据版本。当事务更新数据行时,它会生成当前数据版本。其他事务会继续读取自己的读数据版本,实现隔离性。通过MVCC,读操作就不会加锁,从而实现较高的并发性。

锁机制

尽管MVCC可以实现较高的并发读,但对于写操作仍需要加锁来维护数据一致性。InnoDB支持以下两种锁:

  • 行锁(Row lock):锁定索引值对应的一行。
  • 表锁(Table lock):锁定整个表。在事务中,锁的获取顺序遵循2PL(两段锁定协议),解锁顺序则相反。这保证了事务执行的原子性。当事务提交或回滚时,InnoDB会根据二进制日志来决定是提交还是回滚对数据的修改。此时会生成一个提交版本或回滚版本,完成持久化。

操作步骤

  • 开启事务:START TRANSACTION;
  • 读取数据(MVCC读):SELECT * FROM tbl;
  • 更新数据(加行锁):UPDATE tbl SET col = 1 WHERE id = 1;
  • 提交事务(生成提交版本):COMMIT; 或者回滚事务(生成回滚版本):ROLLBACK;
  • 数据持久化到磁盘。

InnoDB的事务概念特性

1. ACID特性

InnoDB遵循ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability)。

  • 原子性:要么执行成功,要么全部回滚;
  • 一致性:事务结束后,数据库状态必须是一致的;
  • 隔离性:并发执行的事务之间是相互隔离的;
  • 持久性:在事务提交之后,对数据库的修改应该被永久地保存到硬盘上。

2. 事务控制块(TCB)

InnoDB通过事务控制块(Transaction Control Block,TCB)实现事务。一个TCB中保存了以下信息:

  • 事务ID;
  • 最近使用的系统版本号;
  • undo log链表指针:用于回滚;
  • redo log链表指针:用于重做;
  • 事务状态标识:活跃、准备阶段、回滚、提交。

3. undo log

InnoDB采用undo log来实现对事务的回滚操作。当一个事务开始后,会在内存中为其分配一块undo log,并在该事务执行修改数据表之前将相关数据先拷贝到undo log中。如果事务执行失败或者回滚,则可以通过undo log还原修改之前的数据。同时,InnoDB还利用了多版本并发控制(MVCC)来实现数据的隔离性。

4. redo log

InnoDB采用redo log来实现对事务的重做操作。redo log是指数据库系统执行修改操作时所记录的日志,它的主要作用是确保当数据库崩溃时不会丢失数据更新操作。当一个事务提交时,redo log会被刷写到磁盘上。

binlog

MySQL的binlog用于实现复制和恢复。它记录了所有会更改数据的SQL语句,以事件的形式保存在二进制日志文件中。主从复制时,从库会读取主库的binlog事件来重放数据的更改,实现数据一致性。恢复时,MySQL可以重放某个时间点之前的所有binlog事件来恢复数据。

binlog包含以下事件:

  • Query Event:记录用户修改数据的SQL语句。
  • Rotate Event:创建一个新的binlog文件,并记录文件名。
  • Format Description Event:binlog文件的元信息,如MySQL版本。
  • XID Event:事务的提交/回滚语句。

binlog的操作步骤:

  1. 启用binlog:log_bin=1
  2. server启动时创建第一个binlog文件mysql-bin.000001
  3. 数据更新语句执行,生成Query Event写入binlog。
  4. 事务提交时生成XID Event,回滚时生成另一个XID Event。
  5. binlog文件大小达到阈值时,生成Rotate Event,并创建新的binlog文件。
  6. MySQL重启时,读取最后一个binlog文件并追加新事件。
  7. 从库连接上主库时,请求并读取binlog实现数据同步。
  8. 恢复时,重放指定时间范围内的所有binlog事件。

0 人点赞