大部分关系数据库并不真的支持ACID

大部分关系数据库宣称与NoSQL的区别是100%支持ACID事务,在现实中,很少有关系数据库包括Oracle能提供正式的ACID保证,即使他们宣传自己是提供真正ACID。

那么,谁在撒谎呢?

来自2013年文章When is "ACID" ACID? Rarely. | Peter Bailis认为:

ACID的教科书正式定义隔离是串行化serializability ,即执行一组事务的结果应该相当于这些事务的串行执行,这就意味着每个操作数据库的事务好像只有它们自己一样,这能确保数据库的正确性和一致性,带有串行化的数据库(ACID中I)提供了任意读写事务并且确保一致性(ACID中的C)或正确性,没有串行化,ACID(特别是一致性)将无法得到保证。

大部分提供ACID的数据库并不提供串行化,作者在文章中列出了18种数据库中默认的只有三个提供串行化(default isolation列),只有9个将串行化作为选项提供(Maximum Isolation列):



图中标注S的表示提供串行化,RC表示read committed; RR表示repeatable read等。

这些关系数据库默认并没有提供串行化,取而代之的是几个弱变种,对于一个数据库来说,没有理由不支持串行化,我们已经拥有很好的算法,我们也已经在ACID可扩展伸缩方面取得飞跃进步,那么默认为什么不提供串行化呢?

一个关键原因是性能,串行化隔离级别会限制并发,传统技术如两段锁2PC相比代价又非常昂贵,另外,想同时获得高可用性和串行化又是不可能的(这些关系数据库即使通过它们现在的弱模型也不能提供高可用性),第三个默认不提供串行化的理由是在弱模型(相对串行化隔离级别低一些的隔离级别)下事务也降低了冲突概率,不太会死锁。但是,这些好处并不是免费的,在这种弱模型下一致性异常还是不断呈现上升趋势。

[该贴被admin于2015-06-28 21:09修改过]

能举个大部分关系型数据库会出现一致性异常或冲突的例子吗?