当前位置: 首页 > 科技观察

数据库的并发和一致性

时间:2023-03-21 13:33:06 科技观察

作为一个分布式强一致性数据库的开发者,我被问过很多次:如果我同时在新加坡和欧洲修改一条记录,比如在新加坡seta=1,在欧洲seta=2,那是什么?结果?我的回答是:可能是a=1,也可能是a=2。那么提问者就会很疑惑和不满:你不是说数据库是强一致性的吗?为什么结果不确定?我很理解他的困惑,但是他提到的“并发操作”和“一致性”没有必然联系。并发性MartinKleppmann提到了并发性的定义:对于定义并发性,确切的时间并不重要:如果两个操作彼此都不知道,我们就简单地将它们称为并发,而不管它们发生的物理时间。要定义并发,时间不是一个因素:如果两个操作彼此不知道(开始和结束以及结果),无论它们发生在什么物理时间,我们都称这两个操作为并发。有这样一个例子:00:00:00时间,向服务器发起请求A,但是服务器一直没有返回结果。然后,在00:00:03时间(显然是在上一个请求发起“之后”之后),再向服务器请求B。那么,我们可以说B在A之后吗?结论是否定的,这两个操作是并发操作!虽然我们明明知道B是在A发起之后才发起的,但是当B发起的时候,(B)并不知道A的结果。根据MartinKleppman的定义,这两个操作是并发的。从时间间隔来理解并发可能会更好。一个操作由一个开始时间点和一个结束时间点组成一个时间间隔。如果两个操作的时间间隔重叠,则无法区分这两个操作。另一种定义并发的方法是:MartinKleppmann:一个操作AhappensbeforeanotheroperationBifBknowsaboutA,ordependsonA,orbuildsuponAinsomeway。如果不是这种情况,则为并发。Consistency一致性与三个因素密切相关:就我对顺序时间和空间的理解,一致性是唯一的期望。也就是说,给定输入条件,可以得出唯一的结果。对于某个操作场景,无论我们重复验证多少次,观察多少次(时间),在哪里观察(空间),结果都是不变的。如果读操作(观察)在写操作之后,那么观察结果就是我们预期的确定结果。如果读操作和写操作是并发的,那么可能观察到旧值,也可能观察到新值。但是,一旦观察到新值,就不可能观察到旧值(也就是Linearizable的意思)。