登录 |  注册
首页 >  面试合集 >  Java面试宝典(第三部分·高级) >  说一下 ACID 是什么?

说一下 ACID 是什么?

什么是ACID

对于事务来说,所有人都应该了解,ACID是他的基本特征,A指的是Atomicity原子性、C指的是Consistency一致性、I指的是Isolation隔离性、D指的是Durability持久性。

A原子性:原子性很好理解,在事务的执行过程中,要么全部执行成功,要么就都不执行,如果有一个失败,其他执行成功的操作都需要回滚。

C一致性:一致性的说法其实有点难以理解,他指的是事务在执行前后,不能破坏数据的完整性。一致性更多的说的是通过AID来达到目的,数据应该符合预先的定义和约束,由应用层面来保证。

I隔离性:多个事务之间是互相隔离的,事务之间不能互相干扰,这也就涉及到隔离级别的问题,不过这个问题不在这篇文章的话题之内。

D持久性:一旦事务提交,数据库中数据的状态就应该是永久性的。即便数据库宕机、崩溃,重启之后数据都应该恢复到之前的状态。

什么是CAP

CAP最早是在2000年的ACM研讨会上,由加州大学伯克利分校的Brewer(布鲁尔)教授提出的一个猜想,所以又被称作布鲁尔定理,而在两年之后被来自MIT麻省理工的Gilbert和Lynch证明了这个猜想,之后CAP理论就成为分布式系统设计的一个公认的定理。

这个定理证明的就是在分布式系统中Consistency一致性、Availability可用性、Partition-tolerance分区容错性是无法同时被满足的,最多只能同时满足其中两个!

C一致性:这里的一致性和事务中的一致性就完全不是一个概念上的东西,引用原文中的描述:

A read is guaranteed to return the most recent write for a given client.

他的解释为,对于一个指定的客户端而言,读操作能够保证最新的写操作的返回结果。

在分布式系统中,数据需要在不同的节点中进行同步,一致性就指的是数据能否在多个节点之间保持一致性。

比如下图中用户在A节点更新x的值为1,之后A在和B进行数据同步时,网络发生问题,导致数据没有同步到B。

这时候用户从B中读取的数据仍然是修改前的数据,这就是数据不一致的情况。

mysql.jpg

cap

但是需要注意的是,这里一致性强调的数据的一致性,他的基本理念中是忽略延迟的

正常的数据复制,从A同步到B,总是会有延迟产生的,那么延迟的这段时间数据就不是一致的了。

A可用性:可用性还是引用原文:

A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout).

翻译为:非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)。

这里强调的是非故障节点在合理的时间,什么是合理的时间?

这个对于不同系统的要求是不一样的,如果针对一个APP电商的订单聚合展示,可能要求每个接口都必须10ms做出响应,这里10ms是合理的时间,超出这个时间我们认为接口太慢,不符合预期,就是不合理的。

如果对于一个后台管理的系统来说,查询时间可能5秒到10秒用户依然可以接受,那么也可以认为是合理的时间。

另外一个重要的点就是合理的响应,这个合理的响应是指返回结果不能是错误的,就比如上面的举例,实际用户希望x应该是1,然而结果不是。或者另外一种就是我在查询的时候,接口给我返回一个异常,那么我们也可以认为系统这时候是不可用的。

P分区容错性:引用原文:

The system will continue to function when network partitions occur.

翻译为,当出现网络分区后,系统能够继续“履行职责”。

在分布式系统中,不同的节点分布在不同的机房,多台服务器形成了不同的子网络。

可能由于网络故障导致丢包或者连接中断等等,导致了分区,子网之间的网络不连通了,这样整个系统的网络环境就被切割成了N个独立的区域。

”履行职责“就是可用性描述中要能合理的时间内返回合理的结果。

那么为什么说CAP最多只能同时满足两个呢?只能选择AP或者CP?

因为在一个分布式系统的网络中,假定的条件就是网络无法100%保证没有问题,也就是说网络的分区是一定会存在的。

既然如此,那么P一定存在。

假设是上面我们保证CP的场景下,由于AB之间同步发生问题,用户从B读取X值,这时候B应该返回错误,那么就不能满足可用性的要求。所以只有CP。

mysql.jpg

而如果想保证AP,B节点可以继续返回x值给用户,但是x的值已经被更新成1了,而AB间同步有问题,B并没有拿到最新的结果,这时候用户拿到的数据就是错误的,那么就违反了一致性的要求。

什么是BASE

BASE理论是Basically Available(基本可用),Soft State(软状态),Eventually consistency(最终一致性)的缩写。

他是由eBay的架构师提出的理论,因为CAP理论追求的是强一致性,而实际上我们真正的业务中很难,或者说很多时候没有必要做到强一致性。

他的理念是每个系统都应该根据自身的业务场景,通过适当的手段来达到最终一致性。

BA基本可用:基本可用指的是在分布式系统出现故障时,允许损失部分可用性。

举个例子来说,在下单的场景,一般都会出现一些搭售的商品,如果搭售的系统出现问题,那么为了保证整个下单的核心可用,可以暂时降级掉搭售的功能。

又或者在双11的时候很多用户都应该体验过,流量激增的时候,为了保证系统的可用性,有一些用户被引导至一个降级的提示页面。

S软状态:软状态也被称为弱状态,他指的是允许系统中数据出现中间状态,并且这种中间状态的数据不会影响整个系统的可用性。

中间态是什么?就是CAP中的不一致,由于节点之间数据同步延迟导致的数据不一致状态。

E最终一致性:系统中的数据虽然有不一致的状态存在,但是经过一段时间后,最终,数据都会达到一致性的状态。

比如数据库的主从同步存在同步、异步的方式,异步的方式主从的延迟是无法避免的问题,但是最终数据都会达到一致的状态。

总结

ACID是事务的基本特征。

CAP是分布式系统设计中的经典理论,他强调数据的强一致性,忽略网络中的延迟导致的不一致性的问题。

BASE理论则是对CAP理论的一个延伸和平衡,实际中,网络的延迟的问题是无法避免的。他也和ACID强调的强一致性模型不同,允许数据在一段时间内的不一致,但是最终达到一致性的状态。

上一篇: 如何获取当前数据库版本?
下一篇: MySQL字段类型char和varchar的区别
推荐文章
  • ASP.NET教程ASP.NET又称为ASP+,基于.NETFramework的Web开发平台,是微软公司推出的新一代脚本语言。ASP.NET是一个使用HTML、CSS、JavaScript和服务器脚本创建网页和网站的开发框架。ASP.NET支持三种不一样的开发模式:WebPages(Web页面)、
  • C# 判断判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。下面是大多数编程语言中典型的判断结构的通常形式:判断语句C#提供了以下类型的判断语句。点击链接查看每个语句的细节。语句描述if语句一个 if语句 由一个布尔表达式后跟
  • C#循环有的时候,可能需要多次执行同一块代码。通常情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。编程语言提供了允许更为复杂的执行路径的多种控制结构。循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的通常形式:循环类型C#提供了以下几种循环类型
  • C#数组(Array)数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,一般认为数组是一个同一类型变量的集合。声明数组变量并不是声明number0、number1、...、number99一个个单独的变量,而是声明一个就像numbers这样的变量,然后使用numbers[0]
  • ASP.NET是一个由微软公司开发的用于构建Web应用程序的框架,它是.NETFramework的一部分。它提供了一种模型-视图-控制器(MVC)架构、Web表单以及最新的ASP.NETCore中的RazorPages等多种开发模式,可以用来创建动态网页和Web服务。以下是一些基础的ASP.NET编
  • 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.Arithmeti
学习大纲