事务隔离级别、CAP理论、BASE理论

〇、 ACID

ACID是计算机领域一个耳熟能详的术语,讲的是事务的四大特性:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。

1. 原子性

指一个事务要么全部成功,要么全部失败,不允许出现中间状态。

2. 一致性

指多个事务并发的情景下,系统必须如同串行执行所有的事务一样,不管并发的过程中具体如何调度,最终的结果都应该符合逻辑预期的结果,这个逻辑预期的结果等于串行执行所有事务的结果。

3. 隔离性

多个事务并发的环境中,每个事务在执行的生命周期里面,都好像是在独占系统运行,不用的事务之间不会感知到彼此的存在,这种感知指的是数据的变化,即对于每个事务操作的数据,都不会受其他事务操作的影响。

4. 持久性

指事务执行完后,该事务对数据的更改便持久存储在数据库中,不会被回滚。

二、 事务隔离级别

标准SQL规范中,定义了4个事务隔离级别:Read Uncommitted、Read Committed、Repeatable Read、Serializable,隔离级别严格性从低到高。

说道隔离界别,那就先说说脏读、不可重复读、幻读。

1. 脏读

有两个事务:A和B。有数据n=500。

  • 事务B开启事务并Write——n=300
  • 事务A开启事务并Read——n=300
  • 事务B Commit or Rollback

这时候A读到的n=300就是脏读,应为事务B还没有提交,A读到了B还没有提交的数据,这个数据可能被B回滚了,所以可能是一个无效数据,也可能是一个中间数据。

2. 不可重复读

有两个事务:A和B。有数据n=500。

  • 事务A开启事务并Read——n=500
  • 事务B开启事务并Write——n=300
  • 事务B Commit
  • 事务ARead——n=300

A在自己的事务周期中连续读了两次n,第一次读取的是500,第二次读取的是300。

注意,不可重复读和脏读的区别在于事务B是否提交,如果B在A第二次读取的时候已经提交了修改,那就是不可重复读,脏读更侧重与读到其他事务还没有提交的数据。

3. 幻读

有两个事务:A和B。有数据n0=100,n1=200。

  • 事务A开启并ReadAll——n0=100,n1=200
  • 事务B开启并Write—–n0=100,n1=200,n2=300
  • 事务B Commit
  • 事务A ReadAll——n0=100,n1=200,n2=300

A两次查询得到了新插入的数据,而旧的数据没有被改变。

不同的隔离级别解决了不同的问题:

隔离级别 脏读 不可重复读 幻读
Read Uncommitted
Read Committed ×
Repeatable Read × ×
Serializable × × ×

二、 CAP理论

CAP同样指的是三个字母:一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance),CAP理论指的是,一个系统中,不可能同时满足这三个条件。注意这里不需要强调是分布式系统,因为分区容错性就隐喻着系统是分布式系统。

分区容错性是分布式系统的基本特性,指当一个节点挂掉的时候,总是有备用的节点顶替故障节点,继续对外提供服务。分区容错性是分布式系统中不可以放弃的条件,放弃了分区容错性就意味着无法保证系统不间断的提供对外的服务。

可用性是指系统需要在限定时间内返回结果,例如在淘宝上添加一个商品到购物车,网站的期待响应时间是300ms,再例如使用HIVE查询海量数据,一条SQL的查询时间应该在分钟级别。这些服务的响应时间都不应该超过用户的心理预期或者逻辑预期,并且需要返回逻辑正确的结果,这就称之为服务可用。

一致性是指对于不同的子节点,任意一个节点对于数据的修改对其他所有节点都是立刻可见的,也就是说,比如在A节点修改了一条数据,那么B节点应该能马上读到这条修改过的数据。

为什么说这三条不能全部同时满足呢?没有严谨的逻辑证明,我只说说我自己的理解。

首先分区容错性是必须存在的,这是分布式系统的基本特性,必须满足。反过来说(反证法),假设不用保证分区容错性,则系统就是单点系统,虽然不存在一致性的问题,但是单点系统有严重的可用性问题,所以可用性依赖于分区容错性的,换句话说,没有分区容错性就不能保证可用性,所以分区容错性无论如何必须满足。对于一致性和可用性,我们期待对一致性的保证不会对可用性造成影响,但这是不可能的。为了严格保证一致性,节点必须暂停服务,去完成和其他节点的数据同步,这个数据同步工作是同步完成的,同步意味着阻塞(并且阻塞时间是不可预期的),阻塞意味着服务不可用,如果异步同步数据,则无法严格保证数据的一致性,因为异步同步的过程依赖于系统调度,同步数据之前完全可能有数据查询请求打过来。

三、BASE理论

如上文说,CAP不可能在一个系统中同时得到保证,但是CAP的每一个条件都是不可以完全放弃的,所以工程师只能在CAP的三个条件中寻找平衡。

分区容错性是没有退路的,所以往往在可用性和一致性之间寻找平衡。这就有了BASE理论。BASE理论指的是:

  • Basically Available (基本可用)
  • Soft State (软状态)
  • Eventually Consistent (最终一致性)

基本可用讲的是分布式系统允许损失部分可用性:

  • 响应时间:正常情况下一个请求的响应时间为200ms,但是少数情况下(节点故障恢复、切换故障节点等情况),响应时间达到了1s,这是还是认为系统可用。
  • 功能损失:例如在电商网站促销高峰,为了保护系统,将部分用户引导到一个降级页面分流,着也可以看做系统基本可用,虽然没有完全满足用户的预期,但是也及时给予用户一个合理的答复。

软状态是指系统允许存在中间状态,但是不影响最终的结果。例如,两个窗口在出售同一张火车票,现在还剩1张,两个窗口看到的余票都是1张,这是有一个窗口已经卖出了这一张火车票,另一个窗口还没来得及更新数据,这时候旅客看到了余票就去购买,但是最终会购买失败。这就是所谓的可以存在中间状态,但是不影响最终结果。

最终一致指的是数据的状态可以在某些时候不一致,但是最终数据都会达到一直。

这篇算是一个铺垫,之后会介绍2PC算法,3PC算法,Paxos算法等。

如果有什么问题,欢迎指出~

我不喝咖啡,但是我相信知识有价。