写在前面
近两年分布式数据库技术加速发展,而由于金融行业技术生态的限制,周围很多同学对其并没有深入的了解,所以进行高性能、高可靠系统设计时往往缺少这一利器。Ivan希望以系列文章的方式与大家交流探讨,加深我们对分布式数据库的认识。本文是该系列文章的第一篇,主要探讨事务管理中的隔离性,厘清相关概念和关键技术,为后面阐述分布式数据库的事务管理做一个铺垫,姑且算是一篇前传吧。
正文
我们首先从定义出发,事务管理包括原子性、一致性、隔离性和持久性四个方面,即ACID。所有数据库专著都会给出这个四个特性的定义,本文我们引用了Jim Gray对其的定义。Jim Gray是事务处理方面的大神,本文中很多内容引自他的论文和专著。为避免转译过程引入的歧义,这里我们直接使用原文。
Atomicity: Either all the changes from the transaction occur (writes, and messages sent), or none occur.
Consistency: The transaction preserves the integrity of stored information.
Isolation: Concurrently executing transactions see the stored information as if they were running serially (one after another).
Durability: Once a transaction commits, the changes it made (writes and messages sent) survive any system failures.
在上述隔离性(Isolation)的定义中,我们可以发现其目标是使并发事务的执行效果与串行一致,但在具体技术实现上往往需要在并发能力和串行化效果之间进行平衡,很难两者兼顾。平衡的结果就是会出现违反串行效果的现象即异常现象(Phenomenon)。通常来说,隔离级别的提升伴随着并发能力的下降,两者负相关。各种数据库在谈到隔离级别时都会引用ANSI SQL-92标准隔离级别,我们来看看它的具体内容。
ANSI SQL-92 Isolation Levels
ANSI SQL-92可能是最早提出了基于异常现象来定义隔离级别的方法,同时没有将隔离级别与具体实现机制绑定,隔离的实现可以基于锁(lock-based)或者无锁(lock-free),兼容了后续的技术发展。该标准根据三种异常现象将隔离性定义为四个级别,具体如下。