最近发现很多基础都记不得了,今天觉得重新将基础回顾一下是非常必要的。
写些笔记作为记录,虽然效率比较低,但是可以将问题考虑的更清楚些。
首先说ACID
A : atomicity 原子性 | a转给b钱,如果b收不到,a也不减少。 |
C:consistency一致性 | 这个问题看上并不简单,所以先引用下贴: https://blog.csdn.net/lc545126483/article/details/80780214 然后也查询了其他的解释,例如:(这个是阿里程序员的解释) 一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本一致性约束。 他说的很简略,但是从字面意思上理解,我觉得与上贴表达的意思不相同。 所以,我觉得,技术对技术概念的理解可能并不完全相同 此https://www.cnblogs.com/captainlucky/p/4720986.html贴,又在另一个侧面,讲了一致性,而这种说法,印证了阿里程序员的解释。 下面来说我的理解:所有人对一个数据的查询结果,都是一致的。 |
I:Isolation独立性(隔离性) | 上面提到的阿里程序员解释为: 事物之间不会互相影响。如:一个事务a转账10元给b,在事务未结束之前,b去查询,并不会看到新增的10元。 这样看来,又与上第一贴中的一致性的解释有冲突。 |
D:Durability持久性 | 提交事务后,就会被保存,关机不丢失 |
说到事务,就必须要说隔离级别
脏读(Dirty Read)
脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚
不可重复读(Unrepeatable Read):只发生在update操作中
不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改。事务B中再次查询时,数据发生了改变
幻读(phantom read)
幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.
隔离级别:
读未提交。存在3个问题
读已提交。只解决脏读,存在2个问题
可重复读。解决脏读,不可重复读。存在一个问题。
串行化。单事物,但是有阻塞。
下面是CAP:
一个分布式系统不可能同时满足CAP,而P是必须要满足的。
https://www.cnblogs.com/captainlucky/p/4720986.html此贴对一致性的解释很赞
C:Consistency一致性 | 数据一致更新,所有数据变动都是同步的 |
A :Availability可用性 | 好的响应性能,高可用性 |
P :Partition tolerance分区容错 | 可靠性,分布式容忍性 |
下面就涉及到如何在CAP三选二的问题。如果是分布式系统,P是必选的,也就是在AC中选择。
A:大多网站架构的选择。也就是保证大并发场景下不崩溃。比如双11,要保证用户正常浏览,但是具体的浏览量统计,可能不保证一直。
C:Redis,MongoDB的选择
另外多说一句,传统数据库,是保证CA
BASE:Basically Available + Soft state + Eventuall consistent
基本可用 + 软状态 + 最终一致
它的思想就是,在双11当天,我要保证系统可用,来牺牲一致性。过了这天以后再来精确统计,以保证一致性。
也就是:让系统放松某一时刻的一致性要求,来换取系统的性能和伸缩性。