Serializability: 数据库领域的ACID中的I。 ANSI SQL isolation有四种隔离级别,由弱到强分别是Read Uncommitted,Read Committed(RC),Repeatable Read(RR)和Serializable。Serializable的含义是:对并发事务包含的操作进行调度后的结果和某种把这些事务一个接一个的执行之后的结果一样。简单的一种调度实现就是真的把所有的事务进行排队,一个个的执行,显然这满足Serializability,问题就是性能。可以看出Serializability是与数据库事务相关的一个概念,一个事务包含多个读,写操作,这些操作由涉及到多个数据对象。
Linearizability: 针对单个操作,单个数据对象而说的。属于CAP中C这个范畴。一个数据被更新后,能够立马被后续的读操作读到。
Strict Serializability: 同时满足Serializability和Linearizability。
举个简单的例子:
两个事务T1,T2,T1先开始,更新数据对象o,T1提交。接着T2开始,读数据对象o,提交。以下两种调度:
1. T1,T2,满足Serializability,也满足Linearizability。
2. T2,T1,满足Serializability,不满足Linearizability,因为T1之前更新的数据T2读不到。
Spanner基于原子钟实现了Linearizability,原子钟精度误差大概7ms,CockroachDB没有高精度原子钟,而是通过NTP同步时钟,机器之间时钟偏差一般能控制到250ms以内,但是也不,这受到网络延时,系统load等因素的影响。如果采用和Spanner一样的方法实现Linearizability,显然性能太差,官方也不鼓励使用。因此,默认情况,CockroachDB提供的只是Serializability(前提依然是时钟偏差控制在一个范围内,可配置),不提供Linearizability,进而不提供Strict Serializability。TiDB和Percolator一样,通过timestamp oracle提供时钟源,同样实现了Linearizability