InnoDB 的事务特性：ACID 原则与隔离级别

admin
Thu, 05 Jun 2025 04:58:32 +0000
Mysql, acid, innodb, 隔离

好的，各位老铁，大家好！今天咱们要唠嗑的主题，绝对是数据库界的扛把子——InnoDB 的事务特性。别看这名字听起来有点高冷，其实它就像咱们日常生活中的靠谱老大哥，承诺的事情绝对做到，保证数据安全可靠，让你用得放心，睡得安稳。 废话不多说，咱们直接进入正题！ 一、事务：数据库世界的“契约精神” 想象一下，你去银行转账，要经过两个步骤： 你的账户扣钱 对方的账户加钱 如果第一个步骤成功了，第二个步骤却失败了（比如网络突然断了），那你的钱岂不是凭空消失了？这可不行！ 事务，就是为了解决这种问题而生的。它可以把一系列数据库操作捆绑成一个不可分割的单元，要么全部成功，要么全部失败。就像签订了一份合同，要么双方都履行，要么谁也不履行，这就是数据库世界的“契约精神”。 二、ACID 原则：InnoDB 的四大金刚 InnoDB 能够保证事务的“契约精神”，靠的就是著名的 ACID 原则。这四个字母分别代表： Atomicity（原子性）：事务是最小的执行单位，不允许分割。要么全部执行完成，要么全部不执行。就像原子一样，不可再分。 Consistency（一致性）：事务执行前后，数据库必须保持一致的状 …

继续阅读“InnoDB 的事务特性：ACID 原则与隔离级别”

The post InnoDB 的事务特性：ACID 原则与隔离级别 first appeared on 智猿学院-前后端，数据库，人工智能，云计算等领域前沿技术讲座.

好的，各位老铁，大家好！今天咱们要唠嗑的主题，绝对是数据库界的扛把子——InnoDB 的事务特性。别看这名字听起来有点高冷，其实它就像咱们日常生活中的靠谱老大哥，承诺的事情绝对做到，保证数据安全可靠，让你用得放心，睡得安稳。

废话不多说，咱们直接进入正题！

一、事务：数据库世界的“契约精神”

想象一下，你去银行转账，要经过两个步骤：

1. 你的账户扣钱

2. 对方的账户加钱

如果第一个步骤成功了，第二个步骤却失败了（比如网络突然断了），那你的钱岂不是凭空消失了？这可不行！

事务，就是为了解决这种问题而生的。它可以把一系列数据库操作捆绑成一个不可分割的单元，要么全部成功，要么全部失败。就像签订了一份合同，要么双方都履行，要么谁也不履行，这就是数据库世界的“契约精神”。

二、ACID 原则：InnoDB 的四大金刚

InnoDB 能够保证事务的“契约精神”，靠的就是著名的 ACID 原则。这四个字母分别代表：

Atomicity（原子性）：事务是最小的执行单位，不允许分割。要么全部执行完成，要么全部不执行。就像原子一样，不可再分。

Consistency（一致性）：事务执行前后，数据库必须保持一致的状态。不能因为事务的执行，导致数据出现错误。就像做菜一样，食材要新鲜，步骤要正确，才能做出美味佳肴。

Isolation（隔离性）：多个事务并发执行时，各个事务之间应该互相隔离，互不干扰。就像在 KTV 里唱歌，你的包间再嗨，也不能影响隔壁老王深情演唱。

Durability（持久性）：事务一旦提交，对数据库的修改就是永久性的。即使数据库崩溃重启，修改后的数据也不会丢失。就像刻在石头上的文字，风吹雨打也不会消失。

这四个原则，就像 InnoDB 的四大金刚，守护着数据的安全和完整。咱们一个一个来细品。

1. 原子性（Atomicity）：要么都成功，要么都失败

原子性就像一个开关，要么全开，要么全关，没有中间状态。还是拿银行转账的例子来说：

START TRANSACTION; -- 开启事务
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1; -- 你的账户扣 100
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2; -- 对方的账户加 100
COMMIT; -- 提交事务

如果 UPDATE accounts SET balance = balance + 100 WHERE account_id = 2; 语句执行失败，比如对方账户不存在，那么整个事务就会回滚（Rollback），撤销之前的操作，你的账户也不会扣钱。

2. 一致性（Consistency）：保证数据永远正确

一致性是 ACID 中最核心的概念，它保证了事务执行前后，数据库始终处于合法的状态。这个“合法”的状态，是由数据库的约束条件定义的，比如：

账户余额不能为负数

订单总价必须等于商品单价之和

如果事务执行过程中违反了这些约束条件，数据库就会拒绝执行，保证数据的一致性。就像盖房子一样，地基要稳固，结构要合理，才能保证房子不倒塌。

3. 隔离性（Isolation）：互不干扰，各自安好

隔离性是指多个事务并发执行时，各个事务之间应该互相隔离，互不干扰。如果没有隔离性，就会出现各种并发问题，比如：

脏读（Dirty Read）： 事务 A 读取了事务 B 尚未提交的数据。如果事务 B 后来回滚了，那么事务 A 读取到的就是无效的数据。

不可重复读（Non-repeatable Read）： 事务 A 多次读取同一行数据，结果读取到的数据不一致。这是因为在事务 A 多次读取的过程中，事务 B 修改了该行数据并提交了。

幻读（Phantom Read）： 事务 A 多次执行同一条查询语句，结果查询到的数据行数不一致。这是因为在事务 A 多次查询的过程中，事务 B 插入或删除了符合查询条件的数据。

为了解决这些并发问题，InnoDB 提供了四种隔离级别，咱们接下来详细讲解。

4. 持久性（Durability）：落袋为安，永不丢失

持久性是指事务一旦提交，对数据库的修改就是永久性的。即使数据库崩溃重启，修改后的数据也不会丢失。

InnoDB 通过 Write-Ahead Logging (WAL) 技术来实现持久性。简单来说，就是先将事务的修改写入到日志文件中，然后再将修改应用到数据文件中。这样，即使数据库崩溃，也可以通过重放日志文件来恢复数据。就像写日记一样，每天记录发生的事情，即使忘记了，也可以通过日记来回忆。

三、InnoDB 的隔离级别：选择适合你的“防护罩”

InnoDB 提供了四种隔离级别，分别是：

隔离级别 | 脏读 | 不可重复读 | 幻读
READ UNCOMMITTED | √ | √ | √
READ COMMITTED | × | √ | √
REPEATABLE READ (InnoDB 默认) | × | × | √
SERIALIZABLE | × | × | ×

READ UNCOMMITTED（读未提交）： 这是隔离级别最低的级别，允许读取尚未提交的数据。在这种级别下，会出现脏读、不可重复读和幻读等并发问题。就好比你直接看别人草稿，里面的内容随时可能被修改，参考价值不大。

READ COMMITTED（读已提交）： 允许读取已经提交的数据。可以避免脏读，但仍然会出现不可重复读和幻读。就好比你只能看别人最终发布的内容，但是别人发布后又修改了，你再次看的时候内容可能就不一样了。

REPEATABLE READ（可重复读）： 这是 InnoDB 的默认隔离级别。可以避免脏读和不可重复读，但仍然会出现幻读。就好比你每次看同一篇文章，内容都是一样的，但是如果别人新增了一些文章，你再次看的时候，文章总数可能会发生变化。

SERIALIZABLE（串行化）： 这是隔离级别最高的级别。强制事务串行执行，可以避免所有并发问题。就好比所有人排队办事，一个一个来，效率最低，但是最安全。

如何选择隔离级别？

选择合适的隔离级别，需要在并发性能和数据一致性之间进行权衡。

如果并发性能要求很高，可以考虑使用 READ COMMITTED 级别。

如果对数据一致性要求很高，可以使用 REPEATABLE READ 级别（InnoDB 默认）。

如果对数据一致性要求非常高，可以使用 SERIALIZABLE 级别，但并发性能会受到很大影响。

如何设置隔离级别？

可以使用以下 SQL 语句来设置隔离级别：

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

四、MVCC：InnoDB 的并发利器

InnoDB 使用 Multi-Version Concurrency Control (MVCC) 技术来实现并发控制。MVCC 的核心思想是：

为每一行数据维护多个版本

读取数据时，读取符合当前事务隔离级别的版本

修改数据时，创建一个新的版本

这样，多个事务就可以同时读取同一行数据，而不会互相干扰。就像时间旅行一样，每个事务都可以看到自己时间线上的数据版本，互不影响。

MVCC 通过以下两种机制来实现：

隐藏字段： InnoDB 为每一行数据添加了三个隐藏字段：

DB_TRX_ID：创建或修改该行的事务 ID

DB_ROLLBACK_PTR：指向该行数据的上一个版本的指针

DB_ROW_ID：行 ID，如果没有主键，InnoDB 会自动创建一个

Undo Log： 存储了行数据的历史版本。当事务回滚时，可以通过 Undo Log 来恢复数据。

MVCC 的工作流程：

1. 读取数据：

InnoDB 会根据当前事务的隔离级别，选择合适的版本进行读取。

对于 READ COMMITTED 级别，会读取最新的已提交版本。

对于 REPEATABLE READ 级别，会读取事务开始时的版本。

2. 修改数据：

InnoDB 会创建一个新的版本，并将 DB_TRX_ID 设置为当前事务 ID。

将 DB_ROLLBACK_PTR 指向上一个版本。

将修改后的数据写入到新的版本中。

3. 提交事务：

将当前事务 ID 提交。

4. 回滚事务：

通过 Undo Log 恢复到上一个版本。

五、总结：InnoDB 事务特性，数据安全的守护神

今天咱们深入探讨了 InnoDB 的事务特性，了解了 ACID 原则和隔离级别，以及 MVCC 技术。这些特性共同保证了数据的安全和完整，让咱们可以放心地使用 InnoDB 数据库。

总而言之，InnoDB 的事务特性就像一个强大的盾牌，保护着咱们的数据免受各种风险的侵害。掌握这些特性，可以帮助咱们更好地理解数据库的运行机制，编写出更健壮、更可靠的应用程序。

希望今天的分享对大家有所帮助！如果觉得有用，别忘了点赞、收藏、转发哦！咱们下期再见！