0%

学习笔记之数据库

数据库知识点总结,面试重点详解。

数据库的三范式

第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。

第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。

第三范式:任何非主属性不依赖于其他非主属性。

事务特性(ACID)

1、原子性(Atomicity):指当前的事务要不全执行,要不全都不执行

2、一致性(Consistency):指数据状态不会发生改变,事务开始前和事务结束后,数据库的完整性不会改变。

3、隔离性(Isolation):指事务之间是相互隔离的,可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

4、持久性(Druability):事务处理结束后,对数据的修改时永久的,能够保存到数据库中。

原子性

实现原理:通过在存储引擎中的undo文件,通过撤销操作,实现对于数据库的内容进行回滚。

隔离性

严格来说事务之间应该是完全隔离的,但是在InooDB中存在着事务隔离机制

事务隔离级别

Read uncommited:未提交读,最低隔离级别,事务提交之前,就可以被其他事务读取。存在脏读、不可重复读、幻读等问题。

Read commited:提交读,事务提交后才能被其他事务读取到。会导致不可重复读、幻读。

Repeatable-Read:可重复读,MySQL默认隔离级别,保证多次读取同一个数据时,其值都是可事务开始时候的内容一致,机制读取到其他事务未提交的数据。会导致幻读。

Serializable:序列化,代价最高,最可靠的隔离级别,该隔离机制可以防止脏读、不可重复读和幻读。

什么是脏读、不可重复读和幻读?

脏读:表示一个事务能够读取到另一个事务还未提交的数据。比如,某个事务尝试插入记录A,此时该事务还未提交,然后另一个事务尝试读取并读取到记录A。

不可重复读:是指在一个事务内,多次读取同一数据

幻读:指同一个事务内多次查询返回的结果集不一样。比如,同一个事务A第一次查询时候有n条记录,但是第二次同等条件下查询却有n+1条记录。

发生幻读的原因:另外一个事务新增或删除或者修改了第一个事务结果集中的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

持久性

实现原理:通过存储引擎中的redo文件,数据库当中的内容都需要存储到硬盘当中。

但是,把每个数据都存储到硬盘中的缺点:

​ 1)每次读取一个页的内容,但是对于内容的修改却只有一小部分,

​ 2)针对不同的内容,在硬盘中的IO是随机IO,时间复杂度比较高。

通过一个redo文件,把命令写入到缓冲区当中,对于同步可以采取三种方式,这样做的优点在于:

​ 每次都是对于redo文件的扩展,并且是顺序IO。

一致性

上⾯三种属性都是为了实现, mysql的⼀致性。

​ ⼀般来说是读不加锁通过MVVC来实现选择合适的数据,通过添加隐藏列、创建版本号、删除版本号,以及指向undo log的指针来实现回滚操作。通过next-key lock、通过record key+gap key lock来解决幻读问题。虽然名义上叫做锁,但实际并不是⼀个锁只是⼀个标记通过查找undo log对内容进⾏回滚选择到满⾜条件的数据。对于写数据⼀般进⾏加锁操作。

悲观锁有 排他锁 写锁(X锁) 共享锁 读锁(S锁) 还存在表锁和⾏锁,表锁是对⼀张表加锁,⾏锁是对于表中的⼀⾏进⾏加锁。
还存在意向锁,意向锁并不是真正的锁,在使⽤⾏锁的时候如果每次遍历每⼀⾏去得到所有的锁,这样时间复杂度⽐较⾼。通过加上意向锁,能过减少时间复杂度。
通过写的时候加锁,直到事务结束释放避免了写⽆效。
写的时候加锁,读的时候加锁然后直接释放,可以避免写⽆效,可以避免脏读,但不可以避免不可重复读
通过写的时候加锁,读的时候加速直到事务结束释放,可以避免不可重复读,但是不能够避免的事幻读
可以通过乐观锁的⽅式实现:
MVVC多版本并发控制,实现repeatable read。是通过在命令后⾯加上⼀个创建版本和删除版本
在SELECT的时候要选择,创建版本早于当前事务版本的内容,并删除版本晚于当前版本的内容。对于每⼀⾏的操作存储到undo⽂件中通过⼀个链表来表示各种命令。
insert update delete 的事务版本更新和删除版本也进⾏更新
update 会创建⼀个新的版本号,并且将原来的版本号看做原来的删除版本
对于 rr来说,是每次事务创建⼀个事务ID,对于rc是每个语句创建⼀个readview类。通过多版本并发控制来实现可重复读,对于可能产⽣的幻读通过next-key lock来对其进⾏控制。 next-key lock是通过record key与gap lock来实现对于间隙加锁,这样在⼀个事务之内不会插⼊到间隙当中,这样便不会产⽣幻读。

https://blog.csdn.net/bosiyan/article/details/77480236

https://www.cnblogs.com/crazylqy/p/7821481.html

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!

本文标题:学习笔记之数据库

文章作者:Cheng Dong

发布时间:2019年11月21日 - 15:43

最后更新:2019年11月21日 - 16:37

原始链接:https://www.dchengsd.com/posts/ca1adc13/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。