数据库中关系型数据库的介绍

1.数据库分类

主要分为关系型数据库和非关系型数据库。

1.1 关系型数据库

关系型数据库是依据关系模型来创建的数据库,所谓关系模型就是“一对一、一对多、多对多”等关系模型,关系模型就是指二维表格模型,因此一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。
常见的关系型数据库:Oracle、DB2、Microsoft SQL Server、MySQL等;

1.1.1 ACID理论

ACID,是指在数据库管理系统(DBMS)中事务所具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
在数据库系统中,一个事务是指由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,为了保证事务的顺利执行,事务必须具备ACID特性。
原子性:原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做。即要么转账成功,要么转账失败,是不存在中间的状态。
如果无法保证原子性会怎么样?就会出现数据不一致的情形,A账户减去50元,而B账户增加50元操作失败。系统将无故丢失50元。

隔离性:隔离性是指多个事务并发执行的时候,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。如下图所示:
隔离性图解

持久性:持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

一致性:一致性是指事务执行前后,数据处于一种合法的状态,这种状态是语义上的(即数据自己所编写的逻辑)。 也可以说是事务在完成时,必须使所有的数据都保持一致状态。
例一:A账户有200元,转账300元出去,此时A账户余额为-100元。你自然就发现了此时数据是不一致的,为什么呢?因为你定义了一个状态,余额这列必须大于0。

问题一:Mysql怎么保证一致性的?

  1. 从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现AID三大特性,才有可能实现一致性。例如,原子性无法保证,显然一致性也无法保证。

  2. 事务中不能存在违反约束的代码,一旦存在,一致性还是无法保证的。例如,你在转账的例子中,你的代码里故意不给B账户加钱,那一致性还是无法保证。因此,还必须从应用层角度考虑,通过代码判断数据库数据是否有效,然后决定回滚还是提交数据

问题二: Mysql怎么保证原子性的?
利用Innodb的undo log。
undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。

问题三: Mysql怎么保证持久性的?
利用Innodb的redo log。
对于Mysql是先把磁盘上的数据加载到内存中,在内存中对数据进行修改,再刷回磁盘上。如果此时突然宕机,内存中的数据就会丢失。为解决这个问题,事务提交前直接把数据写入了磁盘。
但这样做问题是?
只修改一个页面里的一个字节,就要将整个页面刷入磁盘,太浪费资源了。毕竟一个页面16kb大小,你只改其中一点点东西,就要将16kb的内容刷入磁盘,听着也不合理。毕竟一个事务里的SQL可能牵涉到多个数据页的修改,而这些数据页可能不是相邻的,也就是属于随机IO。显然操作随机IO,速度会比较慢。
于是,决定采用redo log解决上面的问题。当做数据修改的时候,不仅在内存中操作,还会在redo log中记录这次操作。当事务提交的时候,会将redo log日志进行刷盘(redo log一部分在内存中,一部分在磁盘上)。当数据库宕机重启的时候,会将redo log中的内容恢复到数据库中,再根据undo log和binlog内容决定回滚数据还是提交数据。

采用redo log的好处?
其实好处就是将redo log进行刷盘比对数据页刷盘效率高,具体表现如下

  1. redo log体积小,只记录了哪一页修改内容,所以体积小,刷盘快。
  2. redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。

问题四: Mysql怎么保证隔离性的?
利用的是锁和MVCC机制。
锁:事务1未提交前,锁没有释放,事务2无法进行操作。
MVCC机制:即多版本并发控制大多数的MYSQL事务型存储引擎。如,InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制。事实上,他们都和MVCC–多版本并发控制来一起使用。由于锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销。MVCC是通过保存数据在某个时间点的快照(快照数据在undo log)来实现的。 不同存储引擎的MVCC. 不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制。

展开阅读全文

没有更多推荐了,返回首页