是否符合 Mysql ACID?

Man*_*noj 4 mysql postgresql acid

根据 Postgresql,Mysql 是否不符合 ACID?在一些博客中,我看到 Mysql 不符合 ACID。那有多真实?

在这里不要考虑复制,让我们考虑一个独立的,Mysql ACID 的效率如何?

在我对 Mysql-ACID 的理解中。

A - 原子性(如果一个事务失败必须回滚,则应提交所有事务集。是的意味着所有事务都已提交,不意味着即使失败也必须回滚)。

Mysql 中支持的 IE 特性有。

  • 开始交易;..... 犯罪 ;
  • auto_commit=1;

C - 一致性。

(PK,FK,UK,非空)。它遵守数据库的关系和约束。实例只有在删除其子键时才能删除父键。

我 - 隔离。用户与其提交状态之间的隔离。

读取可重复读取未提交读取已提交序列化

D - 耐用性。在数据库崩溃的事件中,innodb 通过从 iblog 文件中应用已提交的事务来恢复数据库并丢弃未提交的事务。

单击此处查看此问题的来源。 - 是因为博客是@2001 创建的吗?

2017 年 6 月 30 日更新:根据“Evan Carroll”的回复,我亲自测试了5.7.18-enterprise 上的博客实验。实验得到的结果好像是Mysql is Not an ACID Compliant。

Dav*_*ett 8

如果您使用 InnoDB 或类似的存储引擎,那么它应该符合 ACID(参考:https : //en.wikipedia.org/wiki/InnoDB)。myISAM,旧的默认值并且仍然非常常用,绝对符合 ACID。如果将两者混合使用(您可能会发现更简单的表类型性能更好,并且对于可以并且将再次复制的易失性数据是可以接受的,例如 ETL 过程的暂存表),那么您的解决方案将不完全兼容。

ACID 合规性的一个重要警告是,出于性能原因,大多数数据库使用不保证“I”部分的隔离级别 - 这在 ANSI SQL 规范内。为了提供适当的隔离,您需要保证事务是可序列化的,某些数据库甚至不支持这种隔离级别。例如 MySQL+InnoDB 默认为“可重复读取”,而 MS SQL Server 默认为稍微严格的“已提交读”,两者都提供“可序列化”但不是默认值。为什么不总是受支持并且通常不是默认值?性能:完全隔离要求可以显着限制并发。

有一些关于这个主题的好文章。例如,http://www.bailis.org/blog/when-is-acid-acid-rarely/是一个简短且内容丰富的地方,可以在评论中开始一些有趣的讨论。


Eva*_*oll 3

我认为在可重复读取中允许幻像写入不能满足任何 ACID 合规性。

请参阅此博客条目了解更多信息。