MySQL 数据库事务的ACID模型和MVCC

2019-01-15 0 By admin

一、事务的ACID模型

ACID模式在数据库设计原则强调的是:对于业务数据和关键任务应用重要的可靠性方面。
MySQL包含的组件如InnoDB存储引擎紧密结合ACID模型,以便数据不被破坏,并且结果不会因特殊情况(如软件崩溃和硬件故障)而失真。
当您依赖ACID兼容功能时,您不需要重新发明一致性检查和崩溃恢复机制。
如果您有其他软件保护措施,超可靠硬件或可以容忍少量数据丢失或不一致的应用程序,则可以调整MySQL设置以交换部分ACID可靠性以获得更高的性能或吞吐量。

1.1、原子性(Atomicity)

整个事务中的所有操作要么全部成功执行,要么全部失败而回滚。
ACID模型 的原子性方面主要涉及InnoDB 事务。
相关的MySQL功能包括:

自动提交设置。
COMMIT 声明。
ROLLBACK 声明。
来自INFORMATION_SCHEMA 表的操作数据。

1.2、一致性(Consistency)

数据库总是从一个一致性状态转换为另一个一致性状态。
ACID模型 的一致性方面主要涉及内部InnoDB处理以保护数据免受崩溃。
相关的MySQL功能包括:

InnoDB 双写缓冲区。
InnoDB 崩溃恢复。

1.3、隔离性(Isolation)

有多种隔离级别;一个事务所做出的操作在提交之前,其他会话是否可见。
ACID模型 的隔离方面主要涉及InnoDB 事务,特别是适用于每个事务的隔离级别。
相关的MySQL功能包括:

自动提交设置。
SET ISOLATION LEVEL 声明。
InnoDB 锁定的低级细节。在性能调优期间,您可以通过INFORMATION_SCHEMA表格查看这些细节 。

1.4、持久性(Durability)

软、硬件崩溃后,InnoDB数据表驱动会利用事务日志文件重构数据,保证数据不丢失。
ACID模型 的持久性方面涉及MySQL软件功能与您的特定硬件配置进行交互。由于CPU,网络和存储设备的功能有很多可能性,因此提供具体的指导方针是最复杂的。
相关的MySQL功能包括:

InnoDB 双写缓冲区,由innodb_doublewrite 配置选项打开和关闭 。
配置选项 innodb_flush_log_at_trx_commit。
配置选项 sync_binlog。
配置选项 innodb_file_per_table。
在存储设备(如磁盘驱动器,SSD或RAID阵列)中写入缓冲区。
存储设备中的电池备份缓存。
用于运行MySQL的操作系统,特别是它对fsync()系统调用的支持。
不间断电源(UPS)保护运行MySQL服务器和存储MySQL数据的所有计算机服务器和存储设备的电源。
您的备份策略,例如备份频率和类型以及备份保留期。
对于分布式或托管数据应用程序,MySQL服务器硬件所在数据中心的特定特征以及数据中心之间的网络连接。

二、InnoDB 多版本并发控制MVCC

InnoDB是一个多版本的存储引擎。它保存在之前被修改的信息,来支持事务功能;如并发和回滚。
这些信息存储在表空间中的数据结构中,称为回滚段。InnoDB使用回滚段中的信息执行事务回滚中所需的撤回操作。它还使用这些信息构建被修改的数据的之前版本,处理并发下的数据一致性。

2.1、撤销日志回滚段

撤销日志回滚段分为插入和更新撤消日志。
插入撤消日志只在事务回滚中需要,并且只要事务提交就可以丢弃。
更新撤消日志也用于一致性读取,但只有当没有事务存在时才会被丢弃,该事务 InnoDB已分配了一个快照,在一致的读取中可能需要更新撤消日志中的信息来构建数据库的较早版本行。

定期提交您的处理,包括只发布一致读取的处理。否则, InnoDB不能从更新撤消日志中丢弃数据,并且回滚段可能变得太大,从而填满你的表空间。

回滚段中撤销日志记录的物理大小通常小于相应的插入或更新行。您可以使用此信息来计算回滚段所需的空间。

在InnoDB 多版本并发控制中,当使用SQL语句删除数据行时,数据行并不会立即从数据库中删除。只有当此删除操作的回滚记录被删除掉时,才会从物理上删除相应的数据行和其索引记录。这个删除操作成为’清除’,处理非常快。