Lenny-Hu / note

blog
5 stars 1 forks source link

理解数据库的事务,ACID,CAP和一致性 #20

Open Lenny-Hu opened 5 years ago

Lenny-Hu commented 5 years ago

作者:geekpy 链接:https://www.jianshu.com/p/2c30d1fe5c4e

什么是事务?

事务是指由一系列数据库操作组成的一个完整的逻辑过程,这个过程中的所有操作要么都成功,要么都不成功。比如:常见的例子就是银行转账的例子,一次转账操作会包含多个数据库操作,而这些数据库操作需要放到一个事务当中,保证其要么都成功,要么都不成功。

什么是ACID?

ACID是事务的四个特性,指的是atomicity,原子性;consistency,一致性;isolation,隔离性;durability,持久性。

  1. 原子性(atomicity): 指所有在事务中的操作要么都成功,要么都不成功,所有的操作都不可分割,没有中间状态。一旦某一步执行失败,就会全部回滚到初始状态。

  2. 一致性(consistency): 指的是逻辑上的一致性,即所有操作是符合现实当中的期望的。具体参考下一节

  3. 隔离性(isolation): 即不同事务之间的相互影响和隔离的程度。比如,不同的隔离级别,事务的并发程度也不同,最强的隔离状态是所有的事务都是串行化的(serializable)(即一个事务完成之后才能进行下一个事务),这样并发性也会降到最低,在保证了强一致性的情况下,性能也会受很大影响,所以在实际工程当中,往往会折中一下。

  4. 持久性(durability): 可以简单地理解为事务执行完毕后数据不可逆并持久化存储于存储系统当中。

内部一致性

要理解内部一致性也就是我们通常所说的ACID中的一致性,就必须从反面考虑什么情况下是不一致的。不一致的情况主要有以下几种情况:

其中前三种(丢失修改、不能重复读、脏读)都是由于并发事务在修改同一份数据的时候导致的问题,此类问题可以通过对同一个资源加锁的方式来解决,而最后一种情况是由于不同事务并发时,新增数据导致的问题,对于新增的记录是无法加锁的,此种情况只能通过事务的串行化来解决。而串行化与并发是矛盾的,所以要在性能和事务的一致性强度上取得一个平衡,就涉及到不同的隔离等级,关于隔离等级,详见理解隔离性一节。

外部一致性

在分布式系统中我们所说的一致性,也就是外部一致性,通常会分为强一致性,弱一致性,还有最终一致性,而要理解外部一致性,需要对CAP理论(Consistency,Availability和Partition Tolerance)有所了解,关于CAP详见CAP定理一节。

理解隔离性

事务的隔离级别从低到高有读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

CAP定理

CAP理论主要是针对分布式存储系统的,C是指Consistency一致性,A是指Availability可用性,P是指Partition tolerance分区容忍性。CAP定理认为分布式系统中这三个特性最多只能同时满足两个特性。下面我们来分别看下这三个特性究竟是什么意思。

那么,为什么说三个特性无法全部保证呢?首先,假如我们要保证分区容忍性,必然要做多个副本节点,而这必然会带来一致性的问题,即保证多个节点的数据是相同的,但是,要让多个节点数据相同,就必须要花时间去复制数据,这还是能够正常通信的情况下,那么在数据复制的过程中为了保持一致性,就不能对外提供服务,所以这段时间就无法满足可用性的问题。 实际工程通常会采取一些折中措施,比如并不保证强一致性,只保证最终一致性,什么意思呢?比如,有三个数据节点互为备份,某份数据在节点A更改后,需要将更改复制到节点B和C,假设复制过程中,有客户访问该数据,那么此时不保证是一致的,即访问A节点的用户得到的是最新数据,而访问B和C节点的用户得到是老数据,但是最终,数据会复制完成,所以最终A、B、C三个节点的数据是一致的。(比如像文章点赞这种数据,延迟下也没有关系啦)

Reference