大部分关系数据库宣称与NoSQL的区别是100%支持ACID事务,在现实中,很少有关系数据库包括Oracle能提供正式的ACID保证,即使他们宣传自己是提供真正ACID。
那么,谁在撒谎呢?
文章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相比代价又非常昂贵,另外,想同时获得高可用性和串行化又是不可能的(这些关系数据库即使通过它们现在的弱模型也不能提供高可用性),第三个默认不提供串行化的理由是在弱模型(相对串行化隔离级别低一些的隔离级别)下事务也降低了冲突概率,不太会死锁。但是,这些好处并不是免费的,在这种弱模型下一致性异常还是不断呈现上升趋势。
什么是ACID?
数据库事务必须具备ACID特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。
一致性:指数据库事务不能破坏关系数据的完成性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。
隔离性:指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
持久性:指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
事务的(ACID)特性是由关系数据库管理系统(RDBMS,数据库系统)来实现的。数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。
数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。
================================================
感谢 Coding 和 UPYUN 对本微信的支持。Coding.net 是一个面向开发者的云端开发平台,目前提供代码托管、运行空间、质量控制、项目管理等功能。
upyun.com是国内领先的云服务提供商,专注于提供静态文件的云存储、云处理和CDN加速服务。现在注册,即可免费体验!