一致性,是描述多副本的同步特征(本文我们不讨论分布式数据库中,保持多个分片里的数据在业务逻辑上一致性的情况,仅讨论数据多副本的case)。一般从两个角度来研究:
从全局数据角度来看:
- 强一致性: 无论谁、无论何时读,得到的都是最新写入后的结果
- 线性一致性: 如果把读写操作按照严格时间戳排序,每个进程的读写都遵循该排序的结果
- 顺序一致性: 每个进程的读写操作顺序都一致,但不保证按照时间戳顺序
- 因果一致性: 两个有因果关系(读写了同一数据)的进程之间,读写顺序都一致,不保证按照时间戳顺序,而且无关的进程读写顺序可以不一样
- 一般一致性: 就是传统意义上的最终一致性,各副本上的数据最终是同一个值
从某个客户端角度来看:
- 写后读:同一个客户端,不论在哪里读写,写入后,读出来的总是不旧于刚刚的写入
- 读后写:同一个客户端,不论在哪里读写,读出后,写进去的总是在刚才读出的数的基础上(可能比读出的更加新的基础上)
- 单调读:同一个客户端,不论在哪里读,每次读出的都不旧于上次读出的
- 单调写:同一个客户端,不论在哪里写,每次写入的都是在上次写入基础上(可能比上次写入的更加新的基础上)
- 最终一致:同一个客户端,不论在哪里读写,做了若干次读写、经过一段时间后,看到一个稳定不变的值
这两个角度并不是一一对应的关系。比如,全局数据角度的“强一致性”,要比“客户端角度”的写后读更强,因为可能有多个客户端在并发运行。我们给一个商业应用设计架构的时候,更多是从客户端视角来看问题的。
隔离级别,是研究事务之间数据的可见关系,讨论的是“并行的写入过程中、或者有的已写入(提交)而有的尚未真正写入(未提交)这个过程中”发生的事情;而一致性研究的是大家在都写入后发生的事情,而忽略写入过程、将其看做原子操作。隔离级别跟一致性是正交的关系。