写在前面
本文是一篇CockroachDB官方博客的译文,主要阐述数据库实现串行化隔离的必要性。关于事务隔离性,Ivan曾经在“分布式数据库之事务隔离性”中从理论方面进行过系统的介绍,本文则是从数据库厂商的角度来阐述对隔离性的理解,大家可以将两篇文章结合起来,对隔离性有更加全面客观的理解。CockroachDB的理念是首先保证安全性而后追求高性能,所以花了很大精力实现Serializable Snapshot Isolation,是目前极少的有实用价值的SERIALIZABLE实现。当然,业界也有厂商对可串行化方面投入的必要性持不同观点。Ivan猜测CockroachDB的理念可能是受到了PostgreSQL的影响,毕竟后者是率先支持Serializable Snapshot Isolation的商业数据库,并且CockroachDB在SQL层面也是以兼容PostgreSQL为目标。
正文
大多数数据库都提供了事务隔离级别的选择,可以在正确性和性能之间进行权衡。然而,高性能的代价就是开发人员必须小心研究事务交互否则就会引入一些微妙的错误。CockroachDB 默认提供了强隔离(SERIALIZABLE)可以确保你的应用总是看到期望的数据。在本文中我们将解释这意味着什么以及不充分的隔离在如何影响真实世界的应用。
SQL标准中的隔离性
SQL标准定义四个隔离级别
SERIALIZABLE
REPEATED READ
READ COMMITTED
READ UNCOMMITTED
SERIALIZABLE事务运行时好像在同一时刻仅有一个事务运行;其他隔离级别允许出现SQL标准称作的“三种phenomena”脏读、不可重复读、幻读。后续的研究(此处指Critique,Ivan在文章“分布式数据库之事务隔离性”中已经进行了介绍)定义了额