前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >InnoDB如何实现事务、undo log、redo log、binlog

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

作者头像
青山师
发布2023-05-05 20:08:40
1630
发布2023-05-05 20:08:40
举报

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事件。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • InnoDB如何实现事务、undo log、redo log、binlog
    • 多版本并发控制(MVCC)
      • 锁机制
        • 操作步骤
          • InnoDB的事务概念特性
            • 1. ACID特性
            • 2. 事务控制块(TCB)
            • 3. undo log
            • 4. redo log
          • binlog
          相关产品与服务
          云数据库 MySQL
          腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档