根据 Postgresql,Mysql 不是符合 ACID 的吗?在一些博客中,我看到 Mysql 不符合 ACID。这有多真实?
我们先不考虑这里的复制,让我们考虑一个独立的,Mysql ACID 的效率如何?
在我对 Mysql-ACID 的理解中。
A - 原子性(如果一个失败必须回滚,则应该全部提交一组事务。是意味着所有事务都已提交,不意味着即使一个失败也必须回滚)。
Mysql 中支持的 IE 功能是。
- 开始交易;..... 犯罪 ;
- 自动提交=1;
C - 一致性。
(PK、FK、UK、非空)。它遵守数据库的关系和约束。实例一个父键只有在它的子键被删除时才能被删除。
我 - 隔离。用户及其提交状态之间的隔离。
读可重复读未提交读已提交序列化
D - 耐用性。在数据库崩溃的情况下,innodb 通过从 iblog 文件应用提交的事务并丢弃未提交的事务来恢复数据库。
单击此处查看此问题的来源。 - 是因为博客是@2001 创建的吗?
2017 年6 月 30 日更新:根据“Evan Carroll”的回复,我亲自测试了5.7.18-enterprise 上的博客实验。实验得到的结果似乎是Mysql is Not an ACID Compliant。
如果您使用 InnoDB 或类似的存储引擎,那么它应该符合 ACID(参考:https ://en.wikipedia.org/wiki/InnoDB )。myISAM,旧的默认值,仍然非常常用,绝对不符合 ACID。如果您将两者混合使用(您可能会发现更简单的表类型性能更好,并且对于可以并且将再次复制的易失性数据是可以接受的,例如 ETL 流程的暂存表),那么您的解决方案将不完全兼容。
ACID 合规性的一个重要警告是,出于性能原因,大多数数据库使用不保证“I”部分的隔离级别 - 这在 ANSI SQL 规范内。要提供适当的隔离,您需要保证事务是可序列化的,这是一些 DB 甚至不支持的隔离级别。例如 MySQL+InnoDB 默认为“可重复读取”,而 MS SQL Server 默认为稍微严格的“已提交读”,两者都提供“可序列化”但不是默认值。为什么不总是支持并且通常不是默认设置?性能:完全隔离要求会显着限制并发性。
有几篇关于这个主题的好文章。例如, http://www.bailis.org/blog/when-is-acid-acid-rarely/是一个简短且内容丰富的地方,可以从评论中的一些有趣讨论开始。
不
我不认为允许可重复读取中的幻像写入满足任何 ACID 合规性。
有关更多信息,请参阅此博客条目。
MySQL 是否真的完全遵循 ACID 的特性存在很多争论,每个人都有自己的看法。根据 MySQL 文档 https://dev.mysql.com/doc/refman/5.6/en/mysql-acid.html
带有 Innodb 引擎的 MySQL 紧跟 ACID 属性。但这是他们的观点。
但是我们不应该忘记,在新版本中,MySQL 有了很大的改进,我个人很欣赏 Oracle,他们正在以一种非常好的方式对其进行优化。所以以前的版本可能不遵循 ACID ,但今天是。
但是,让我尝试将所有属性一一列出,带有 Innodb 的 MySQL 如何遵循这些属性:
原子性表示要么回滚要么提交完整的事务。根据我的经验,每当事务中途发生任何崩溃时,Innodb 引擎都会回滚。它通过将事务语句的结果(脏页或修改的行)存储在双写缓冲区(如果启用)或重做日志或二进制日志中来处理(如果启用)并将这些结果写回磁盘,而不管事务是否应处于准备状态。如果不是,则事务将回滚。只需杀死您的 mysqld,然后重新启动它并观察您的错误日志文件。
Innodb 也遵循一致性,因为有各种日志机制(缓冲区)记录数据库发生的所有更改,并帮助我们确保不会发生不一致。
隔离:Innodb 提供了几个行级锁定,可以避免(如果处理得当)任何其他进程获取已被其他进程使用的资源的锁定。它通过将事务语句的结果(修改的行)存储在内存缓冲区中来处理并且只有在事务提交后才将这些结果从缓冲区写回磁盘和二进制日志。
耐用性:根据 MySQL DOC ,ACID 模型的耐用性方面涉及与您的特定硬件配置交互的 MySQL 软件功能。由于取决于您的 CPU、网络和存储设备的功能有许多可能性,因此提供具体指导方针是最复杂的。(这些指导方针可能采取购买“新硬件”的形式。) 。例如二进制日志确保在任何失败的情况下的持久性。
让我知道,如果这对你有帮助:)