一、关系型数据库和非关系型数据库基础
一.1数据库读取/更新问题
脏读:读取到了别人未提交的事务的数据,而且这个事务,到后面还会滚了。使用数据库的READ_COMMITTED以上的隔离级别可以避免。
不可重复度: 先读取了数据,有其他的功能修改了数据,导致现在的数据和数据库的不相等。使用数据库的REPEATABLE_READ以上的隔离级别可以避免。
幻读:先读取了数据,后面其他的应用功能再往这个数据表中插入或者删除了数据,导致的数据不一致。
一.2关系型数据库的ACID规则(针对事务):
①A(Atomicity)原子性: 事务的最小单位就是事务。
②C(Consistency)一致性: 事务前后,数据状态不变。要么全部成功,要么全部失败。
③I(Isolation)隔离性:隔离性表示各个事务之间不会影响,数据库提供了多种隔离级别(isolation Level)。(像sql server的隔离级别有:①READ UNCOMMITTED(未提交读取) ②READ COMMITTED(已提交读取) ③REPEATABLE READ(可重复读取) ④SERIALIZABLE(可序列化))
④D(Durability)持久性:一个成功的事务将永远性改变系统的状态,所以在它结束之前,所有导致状态的变化都记录在一个持久的事务日志中。如果我们的系统受到系统崩溃或断电,那么所有未完成已提交的事务可能会重新执行。
一.3四种隔离级别和会出现的数据库读取问题。
下图是主流数据库的默认隔离界别:
Database | Default isolation Level |
Oracle | READ_COMMITTED |
MYSQL | REPEATABLE_READ |
SQL SERVER | READ_COMMITTED |
POSTGRESQL | READ_COMMITTED |
下图是SQL SERVER四种隔离级别介绍和读取问题出现情况:
Isolation Level | 脏读 | 不可重复读 | 幻读 | Isolation Level说明 |
READ UNCOMMITED(读取未提交的事务) | 允许 | 允许 | 允许 | 读取包含未提交数据。 |
READ COMMITTED(读取已提交事务) | 不允许 | 允许 | 允许 | 这个模式主要作用是避免脏读。 |
REPEATABLE READ(重复读) | 不允许 | 不允许 | 允许 | 事务内的数据,读取到数据后,会把数据锁定,不允许当前事务意外的数据去读取到目标数据。 |
SERIALIZABLE | 不允许 | 不允许 | 不允许 | 事务开启后,对涉及(查询、更新、删除、插入)到的数据表都进行锁定,不允许其他事务对这些表进行增删改操作。 |
CAP定理,又称为布鲁尔定理,指出对于一个分布式系统,不可能同时满足以下三点:①一致性(Consistency)(所有的节点在同一时间具有相同的数据) ②可用性(Availability)(保证每个请求不管成功或者失败都有响应) ③分隔容忍(Partition tolerance)(系统任意信息的丢失或失败不会影响系统的继续运作)
BASE原则:BASE原则是NoSQL数据库通常对可用性及一致性的弱要求原则:①Basic Availble(基本可用) ②Soft-state(软状态/柔性事务) ③Eventual Consistency(最终一致性,也是ACID的最终目的);
二、MongoDB和Redis比较
MongoDB是一个基于分布式文件存储的数据库。
Redis是一个Key-value存储系统。MongoDB建议集群部署,更多的考虑到集群方案,Redis更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。
MongoDB和Redis比较
数据库 | MongoDB | Redis |
简介 | 基于分布式文件存储的数据库,是非关系数据库当中功能最像数据库的。是一个面向集合的、模式自由的文档型数据库。 | 键值对存储的数据库 |
特征 | 最大的特点是:支持的查询语言非常强大,还支持对数据建立索引。 | 数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行。还有丰富的数据结构类型,还支持数据备份。 |
数据类型 | BSON、一种类型Json的二进制键值对数据。 | ①string(字符串) ②hash(哈希) ③list(列表) ④set(集合) ⑤zset(有序集合) |
特征说明 |
①面向集合。集合就相当于关系型数据库里面的表。 ②文档型。文档就是一种类似于JSON的BSON格式二进制数据。(键值对) ③模式自由。不同格式之间的文档可以组成一个集合。 MongoDB的原子性限制在文档级别,对文档的保存、修改和删除都是原子操作。 |
|
比较 | 比较适用数据量大的时候使用。QPS高,没那么安全。因为mongodb的弱类型支持,如果不确定实体类型,可以用mongdb替代传统型关系数据库 | 比较适合做缓存或者锁。读取速度快,TPS高。 |
关系型数据库和非关系型数据库(NoSQL)比较