数据库的ACID属性耳熟能详,但是却又很容易混淆。比如MySQL哪些功能是为了实现一致性?本文笔者就带大家一起看看这个问题。
原子性(Atomicity)
一个事务必须被视为一个不可分割的工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
ACID 模型的原子性方面主要涉及 InnoDB 事务。 相关的 MySQL 功能包括:
- AutoCommit设置
- COMMIT 语句
- ROLLBACK 语句(涉及undo log)
一致性(Consistency)
数据库总是从一个一致性状态转换到下一个一致性状态。如果事务最终没有提交,该事务所做的任何修改都不会被保存到数据库中。
ACID 模型的一致性方面主要涉及内部 InnoDB 处理以保护数据免受崩溃。 相关的 MySQL 功能包括:
-
InnoDB 双写缓冲区(Doublewrite Buffer)。
-
InnoDB 崩溃恢复(Crash Recovery)。
隔离性(Isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。
ACID 模型的隔离方面主要涉及 InnoDB 事务,特别是适用于每个事务的隔离级别。 相关的 MySQL 功能包括:
-
AutoCommit设置。
-
事务隔离级别和 SET TRANSACTION 语句。
-
InnoDB 存储引擎的锁机制。 可以在 INFORMATION_SCHEMA 表和PERFORMANCE_SCHEMA的 data_locks 和 data_lock_waits 表中查看详细信息。
持久性(Durability)
一旦提交,事务所做的修改就会被永久保存到数据库中。此时即使系统崩溃,数据也不会丢失。
ACID模型的持久性,涉及与特定硬件配置交互的 MySQL 软件功能。由于CPU、网络和存储设备的功能有许多可能性,因此提供具体指导方针是最复杂的。 相关的 MySQL 特性包括:
- 双写缓冲区(Doublewrite Buffer)
- innodb_flush_log_at_trx_commit 变量。
- sync_binlog 变量。
- innodb_file_per_table 变量。
后续更新文章分别介绍ACID具体相关功能实现原理。
参考
- https://dev.mysql.com/doc/refman/8.0/en/mysql-acid.html