InnoDB 储存引擎的事务

125 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

一、事务的认识

  • InnoDB 储存引擎事务符合 ACID 的特征,分别指原子性(A)一致性(C)隔离性(I)持久性(D)
  • 原子性(Atomicity):是整个数据库事务不可分割的工作单位,要么都做,要么都不做。
  • 一致性(consistency):指数据库从一个状态转变为下一种一致的状态,即在事务开始和结束,数据库的完整性约束没有被破坏。
  • 隔离性(isolation):事务的隔离性要求每个读写事务的对象对其他事务的操作对象能够互相隔离,即在该事务提交之前对其他事务都不可见。
  • 持久性(durability):是指事务一但提交,数据结果就是永久的。持久性保证了事务系统的高可靠性,不能够保证高可用性。

二、事务实现

  1. redo 实现

redo.jpeg

  • 重做日志(redo log)是用来实现事务的持久性的,其中包括了两个部分:①内存中易失的重做日志缓冲。②持久的重做日志文件。
  • InnoDB 通过 Force Log at Commit 机制持久化事务,即将事务所有日志写入重做日志文件后才进行事务的提交。
  • binlog 二进制日志:产生在 MySQL 数据库上层,是一种逻辑日志,其记录记录的是一条 SQL 语句。binlog 不仅仅针对 InnoDB 储存引擎,对于 MySQL 数据库的任何一种储存引擎都会使用二进制日志。二进制日志只是在事务提交时进行记录,也就是每一个事务都仅仅只有一个日志记录。
  • log block 日志块:InnoDB 储存引擎是以 512 字节为一个单位作为重做日志储存。所以重做日志缓存和重做日志文件是以块为单位的。
  • log group 日志组:是由多个日志文件组成的,也是一个逻辑上的概念。
  • 日志格式:包括日志类型(redo_log_type)、空间 ID (space)、页偏移量(page_no)。
  • LSN:LSN 占用 8 个字节,是标识日志序列号的。
  1. undo 实现

undo.jpeg

  • undo 日志在事务需要进行回滚操作时必不可少的,可以利用 undo 信息将数据回滚到修改之前的状态。
  • undo 日志存放在数据库内部的一个特殊字段,该特殊段位于共享空间。
  • InnoDB 储存引擎有 rollback 字段,每个回滚段种能够记录 1024 log segment。