原子性和一致性的区别
原子性和一致性都要保证一个数据的多个操作整体的成功或者失败,初看两者有一些相似的语义,其实细究一下还是略微有一些区别,原子性主要面向数据库Write的行为定义,而一致性主要面向Read的行为定义。 拿实际例子来说,在分布式场景下如果涉及多节点的数据操作,在微观世界里就不能保障多节点的操作发生在同一时刻,一定是有细微的时间差,在这个时间差内如果用高并发Read操作是否就会看到转账过程中不一致的余额状态?因此数据库技术通常会借助锁机制或者MVCC多版本来实现一致性的行为。比如通常的分布式2PC,会在第一阶段prepare加锁,确保在第二阶段部分节点提交时,剩余部分节点未提交的数据会通过加锁,避免高并发Read操作读到中间提交一半状态的数据。
隔离级别的技术演进
隔离级别的发展比较有故事性,不同数据库产商有各自的实现,缺乏统一的标准。
在1992年ANSI首先尝试指定统一的隔离级别标准,当时主要是基于锁机制来实现事务的并发控制隔离,定义了脏读、不可重复读、幻读的异像,ANSI 92标准中指出可以解决这三类异像的事务隔离称之为"可串行化"。
在1995年,微软的Jim Gray研究员们在《A Critique of ANSI SQL Isolation Levels》论文中批判了ANSI标准,新增了Lost Update(更新丢失)、Read/Write Skew(读写偏序)的异像场景,同时正式提出基于MVCC的快照隔离级别SI。 而当时的Oracle是第一个在商业数据库中应用MVCC的技术,将其基于MVCC的SI隔离技术称之为"可串行化",主要是因为ANSI 92标准中对解决不可重复读、幻读异常定义的技术称之为可串行化,属于特定的文字游戏。
在1999年,在《Generalized Isolation Level Definitions》论文中提出了有向串行图DSG(Direct Serialization Graph)的隔离定义,可以在SI隔离级别的基础上解决Read/Write Skew(读写偏序)的异像问题,称之为SSI(Serializable Snapshot Isolation),主要的代表数据库为PostgreSQL/CockroachDB。