1. 支持 ACID 事务和行级锁
    ACID 事务
    MySQL 中的事务 (Transaction) 是一组逻辑操作的集合,这些操作要么全都执行成功,要么全都失败回滚,以保证数据库的一致性。ACID 是事务的四大基本特性:

原子性 (Atomicity):事务中的所有操作是一个不可分割的原子单位,要么全部执行成功,要么全部回滚。在 MySQL 中,通过 UNDO LOG 实现回滚机制来支持原子性。

一致性 (Consistency):事务执行的前后,数据库状态必须保持一致,即约束和规则必须得到满足。InnoDB 使用锁机制和外键约束确保一致性。

隔离性 (Isolation):并发事务之间互不干扰,MySQL 提供了不同的隔离级别以控制并发问题,如脏读、不可重复读和幻读。通过行级锁和 MVCC 支持高隔离性。

持久性 (Durability):事务提交后,结果是永久性的,即使系统崩溃或断电,数据也不会丢失。InnoDB 通过 REDO LOG 和事务日志的写盘操作来确保数据持久性。

行级锁
MySQL InnoDB 引擎使用行级锁 (Row-level Lock) 而不是表级锁,以提高并发性能:

行级锁的优点:只锁定需要操作的行数据,允许其他事务并行访问不同的行,这样能够显著提高系统的并发性。

行级锁的实现:InnoDB 使用多版本并发控制 (MVCC) 和索引来实现行锁。它依赖于索引来识别被锁的行,因此最好在查询中使用索引条件,否则会锁定整个表。

  1. 多版本并发控制 (MVCC)
    MVCC 的概念
    多版本并发控制 (MVCC) 是一种数据库并发控制机制,它允许数据库同时处理多个事务而不会产生冲突。MVCC 通过保存数据的多个版本,实现“快照隔离”:

快照读:事务读取的不是最新版本的数据,而是事务开始时的数据快照。
一致性读:对于 SELECT 语句,InnoDB 引擎会选择最符合事务一致性要求的数据版本。
MVCC 的实现
InnoDB 通过使用隐藏列 DB_TRX_ID(表示事务 ID)和 DB_ROLL_PTR(回滚指针)来实现 MVCC:

事务 ID (DB_TRX_ID):每次事务开始时分配唯一的 ID,用于标识事务对记录的操作。
回滚指针 (DB_ROLL_PTR):指向该行的 UNDO LOG 记录。如果某条记录被事务修改了,UNDO LOG 会保存修改前的旧值。这样,如果一个事务想读取之前版本的数据,就可以通过 DB_ROLL_PTR 指针查找并读取到过去的版本。
在读写操作时,MySQL 可以通过这些隐藏列判断数据的版本是否符合当前事务的隔离级别,从而避免加锁操作,提高了数据库的并发处理能力。

  1. UNDO LOG 和 REDO LOG
    UNDO LOG
    UNDO LOG 是 InnoDB 用于回滚和 MVCC 的日志,它记录了数据修改前的状态。UNDO LOG 主要有两个作用:

事务回滚:如果事务需要回滚,InnoDB 可以根据 UNDO LOG 将数据恢复到事务执行前的状态,从而保证事务的原子性。

多版本控制 (MVCC):UNDO LOG 提供数据的历史版本,通过回滚指针 (DB_ROLL_PTR) 指向旧数据,为 MVCC 提供支持。每个事务可以通过 UNDO LOG 获取该行在事务开始时的快照数据,实现一致性读。

UNDO LOG 的类型主要有两种:

插入类型 (Insert Undo):用于插入新数据时,记录插入之前的数据状态。只在事务未提交时需要回滚。
更新类型 (Update Undo):记录数据更新前的状态,用于事务回滚和 MVCC。
UNDO LOG 一般存储在内存中,但可能会因需要或内存不足而被写入磁盘。

REDO LOG
REDO LOG 是 MySQL InnoDB 的重做日志,用于记录已提交事务的修改操作,确保数据的持久性。REDO LOG 的作用主要是:

崩溃恢复:在系统崩溃或断电后,通过 REDO LOG 重做提交的事务,从而恢复数据库。

持久性:在事务提交时,InnoDB 会先将 REDO LOG 写入磁盘,即使主数据文件未更新,REDO LOG 也确保了事务的持久性。

REDO LOG 由两个文件组成,记录了数据页的更改。每当有修改操作时,InnoDB 会将变更写入 REDO LOG,并将其持久化到磁盘,而不必立即修改数据文件。这样可以减少磁盘 I/O,提高数据库性能。

两阶段提交:为了确保数据一致性,MySQL 使用了两阶段提交机制,即当事务执行时,先写入 REDO LOG,然后更新主数据文件,这样即使系统崩溃也能通过重做日志恢复到一致状态。
4. UNDO LOG 和 REDO LOG 的区别
特性 UNDO LOG REDO LOG
主要作用 支持事务回滚和 MVCC 支持事务的持久性和崩溃恢复
记录内容 修改前的数据快照 修改后的数据操作
写入时机 事务开始时或修改数据时 事务提交前
数据保存位置 内存中,必要时写入磁盘 持久化存储在磁盘中
是否持久化 否,只在回滚和 MVCC 使用 是,用于崩溃恢复和持久化
小结
MySQL 的 ACID 特性和高并发控制依赖于事务管理和日志机制。InnoDB 通过行级锁和 MVCC 提高并发性,通过 UNDO LOG 提供回滚和一致性读,使用 REDO LOG 实现事务持久性和崩溃恢复。这些机制共同确保了数据库在高并发环境下的性能和数据一致性。