InnoDB事务:揭秘数据操作的幕后本质与逻辑存储之奥秘
2023-12-12 01:23:54
InnoDB:事务本质论析与逻辑存储结构解析
从现代计算机技术发展史的角度看,为了提高数据传输速度,人们发明了专门用于处理磁盘数据读写的I/O处理技术。而为了使计算机操作系统可以实现对I/O设备的统一控制,出现了如文件系统等更为底层的逻辑抽象。
文件系统诞生之初的目的并不像今天所展示出来的那样庞杂。它往往只专注于一项工作,如实现FAT文件系统仅仅是希望能够将数据存储到磁盘,供操作系统运行使用。随着技术的发展,人们希望存储的文件不再是简单的二进制文件,而是可以进行修改的复杂文件,这就使得文件系统需要实现更多的特性。包括:提供对文件/目录的读、写和删除等操作;能够记录更多的元信息,如文件名、创建时间、文件修改时间等;能够支持文件和目录的层级结构。
文件系统设计的基本原则是:提供一个能够表示文件和目录以及它们的属性、为文件和目录分配磁盘空间以及维护文件和目录的目录结构。磁盘文件系统主要由引导块、超级块、文件分配表、空闲块表、数据块和目录块六个部分组成。
为了便于管理,文件系统通常会把磁盘空间按照固定的大小划分为若干个块,每一个块的大小在文件系统初始化时就固定下来,不能够再进行更改,这种块称为磁盘块。
文件系统的文件存储、目录存储以及文件组织方式通常决定了文件系统最适合的应用领域。文件系统之所以能够实现更高的磁盘空间利用率,是因为在文件系统存储文件的逻辑地址(逻辑块号,一个文件中的块的位置)和磁盘中存放文件的物理地址(物理块号,块在磁盘的具体位置)之间实现了解耦。这种解耦的设计为实现文件系统的高效管理奠定了基础,它使文件可以不连续的存储在磁盘上,并且磁盘的坏块也不会对文件的使用造成影响。文件系统的目录不仅记录了文件存储的物理地址,还记录了文件在存储介质上的存储方式。
在文件系统中,存储的文件实际上存储的是一堆存储块的信息,存储块的大小是4K或者8K等,逻辑存储块通常是4K,即4096字节。文件系统在管理磁盘文件时,将文件内容映射到磁盘上的存储块,并存储块为单位进行管理,由此便形成了文件系统数据存储的基本单位。
文件系统所映射出来的物理存储结构如下图所示:
![InnoDB存储结构]
在InnoDB中,所有数据都是存储在磁盘中的表空间文件中。表空间文件可以是单个文件,也可以是多个文件。表空间文件由若干个数据文件组成,每个数据文件的大小通常为16MB。数据文件又由若干个数据页组成,每个数据页的大小通常为16KB。
InnoDB存储引擎的事务机制是基于ACID特性来实现的。ACID是数据库事务的四大基本特性,分别代表原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
原子性是指一个事务中的所有操作要么全部成功,要么全部失败。也就是说,一个事务中的所有操作必须作为一个整体来执行,不能被分割或打断。
一致性是指一个事务中的所有操作必须使数据库从一个一致的状态转换到另一个一致的状态。也就是说,一个事务不能破坏数据库的完整性。
隔离性是指一个事务中的操作与其他事务的操作是相互隔离的。也就是说,一个事务的操作不会影响其他事务的操作,反之亦然。
持久性是指一个事务一旦提交,其对数据库所做的修改就会永久保存下来,即使发生系统故障,也不会丢失。
InnoDB存储引擎通过各种机制来保证事务的ACID特性,包括:
- 回滚段(Rollback Segment): 用于存储事务的回滚信息,当一个事务回滚时,回滚段中的信息会被用来恢复数据库到事务开始之前的状态。
- 重做日志(Redo Log): 用于存储事务的提交信息,当一个事务提交时,重做日志中的信息会被用来将事务对数据库所做的修改持久化到磁盘。
- MVCC(多版本并发控制): 用于保证事务的隔离性,MVCC通过为每个事务创建一个自己的版本来实现,每个版本都包含了对数据库所做的修改。
- 锁机制: 用于防止多个事务同时修改同一个数据,锁机制通过对数据加锁来实现,一个事务在修改数据之前必须先获得数据的锁。
InnoDB存储引擎提供了四种隔离级别:
- 读未提交(Read Uncommitted): 允许一个事务读取另一个事务未提交的数据。
- 读已提交(Read Committed): 只允许一个事务读取另一个事务已提交的数据。
- 可重复读(Repeatable Read): 保证一个事务在执行过程中看到的其他事务的数据始终是一致的。
- 串行化(Serializable): 保证一个事务在执行过程中看到的其他事务的数据与该事务执行之前的数据是一致的。
隔离级别的选择取决于应用程序对数据一致性的要求,隔离级别越高,数据一致性越好,但性能也越低。