MySQL 通过其存储引擎(特别是 InnoDB)实现了事务的 ACID 属性。ACID 是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)的首字母缩写,这四个属性是数据库事务的基础。下面我们将详细解释 MySQL 如何实现这些属性:
原子性(Atomicity):
原子性确保事务是一个不可分割的工作单位,事务中的操作要么全部完成,要么全部不完成。
在 MySQL 中,InnoDB 存储引擎通过 undo 日志来实现原子性。当事务执行修改时,InnoDB 会首先记录这些修改前的原始数据到一个 undo 日志中。如果事务因为某种原因(如系统崩溃)而中断,InnoDB 可以使用 undo 日志来撤销事务已经做的修改,从而保持数据的完整性。
在事务提交时,相关的 undo 日志记录会被标记为可清理,但在事务失败或回滚时,这些记录会被用来撤销所做的更改。
2.一致性(Consistency):
一致性确保事务将数据库从一个一致性状态转变到另一个一致性状态。即,在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。
InnoDB 通过其内部的数据完整性检查和约束来维护一致性。例如,当执行一个外键约束的插入或更新操作时,如果操作违反了外键约束,InnoDB 会阻止该事务的提交。
3.隔离性(Isolation):
隔离性确保事务的执行不会受到其他并发事务的干扰。每个事务都感觉自己是在单独执行,即使实际上它们可能同时运行。
InnoDB 使用多版本并发控制(MVCC)来实现隔离性。MVCC 允许每个事务看到它开始时的数据的一个一致的快照,而不会被其他并发事务的修改所干扰。这通过为每个事务分配一个唯一的事务 ID 并使用这些 ID 来确定它可以看到哪些版本的数据来实现。
InnoDB 还提供了几种隔离级别(如 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE),允许用户根据应用程序的需求调整隔离级别。