蒋豆芽的面试题专栏(31/数据库基础)
-
数据库事务以及四个特性⭐⭐⭐⭐⭐
-
数据库三大范式⭐⭐⭐⭐⭐
-
事务的隔离级别⭐⭐⭐⭐⭐
-
什么是数据库索引⭐⭐⭐⭐⭐
-
索引类型与索引模型⭐⭐⭐⭐⭐
-
什么情况下数据库索引会失效⭐⭐⭐⭐⭐
-
引起慢查询的常见原因及一些解决方案⭐⭐⭐⭐⭐
-
聚簇索引与非聚簇索引⭐⭐⭐⭐⭐
-
数据库主键和外键⭐⭐⭐⭐⭐
-
mysql知道哪些存储引擎,它们的区别⭐⭐⭐⭐⭐
-
关系型数据库和非关系型数据库的区别⭐⭐⭐⭐⭐
-
数据库垂直与水平拆分怎么做⭐⭐⭐⭐⭐
-
什么是内联接、左联接、右联接⭐⭐⭐⭐⭐
-
乐观锁与悲观锁⭐⭐⭐⭐⭐
-
MVCC原理⭐⭐⭐⭐⭐
-
B树与B+树⭐⭐⭐⭐⭐
=========================================================================================================
- 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。
- 本专栏适合于互联网C++软件开发、嵌入式软件求职的学生或人士。
- 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵
- 针对于非科班同学,建议学习本人专刊文章《蒋豆芽的秋招打怪之旅》,该专刊文章对每一个知识点进行了详细解析。
- 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
- 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。
=========================================================================================================
-
数据库事务以及四个特性⭐⭐⭐⭐⭐
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。数据库事务是数据库最小逻辑单元。
四个特性:
-
原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对事务有任何影响。
-
一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。例如:A和B进行转账操作,A有200块钱,B有300块钱;当A转了100块钱给B之后,他们2个人的总额还是500块钱,不会改变。
-
隔离性(Isolation):隔离性是指当多个用户并发访问数据库时,比如同时访问一张表,数据库每一个用户开启的事务,不能被其他事务所做的操作干扰(也就是事务之间的隔离),多个并发事务之间,应当相互隔离。
例如同时有T1和T2两个并发事务,从T1角度来看,T2要不在T1执行之前就已经结束,要么在T1执行完成后才开始。将多个事务隔离开,每个事务都不能访问到其他事务操作过程中的状态;就好比上锁操作,只有一个事务做完了,另外一个事务才能执行。
-
持久性(Durability):持久性是指事务的操作,一旦提交,对于数据库中数据的改变是永久性的,即使数据库发生故障也不能丢失已提交事务所完成的改变。
-
-
数据库三大范式⭐⭐⭐⭐⭐
- 第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;(比如“姓名与年龄“,我们应该拆分成两个字段:“姓名“、“年龄“。)
- 第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于同一个主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;(比如我们主字段是教师的“姓名“,那么字段“年龄“、“工号“、“工资“、“电话“都是与教师相关的,而字段“销售额“跟我们教师没有关系,就要去掉。)
- 第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关;(如果某一属性依赖于其他非主键属性,而其他非主键属性又依赖于主键,那么这个属性就是间接依赖于主键)
-
事务的隔离级别⭐⭐⭐⭐⭐
事务的隔离性就是指,多个并发的事务同时访问一个数据库时,一个事务不应该被另一个事务所干扰,每个并发的事务间要相互进行隔离。
-
读未提交(Read Uncommitted):因为没有行级共享锁,会出现脏读。
脏读就是,比如两个事务都在操作同一个表,A事务修改了C字段的值没有提交该事务;而B事务也在读取C字段的值,就在这时A事务发生了失败回滚,那么C字段的值返回原来的值,所以B事务发生了脏读。整个过程结束,数据库没有发生任何改变,B事务却读到了奇怪的值,这就是脏读。解决办法是行级共享锁。
-
读提交(Read Committed):通过行级共享锁,解决了脏读问题,但因为事务没有加锁,导致前后读取数据不一致,即不可重复读。
不可重复读就是,比如两个事务都在操作同一个表,A事务先读取了C字段的值后继续操作下一个字段;而B事务在这个时候修改了C字段的值。A事务再读取C字段的值,发现同一个事务下,竟然前后两次读取不一样,这就很怪异了,这就是不可重复读。解决办法是对事务进行加锁。
-
可重复读(Repeated Read):通过事务加锁,解决了不可重复读问题,但因为表没有加锁,会出现幻读的情况,比如多了一行数据。
幻读就是,比如两个事务都在操作同一个表,A事务先读取了表的行数;而B事务在这个时候为表格新插入了一行数据。A事务再读取表的行数,发现竟多了一行,这就很怪异了,这就是幻读。解决办法是对表进行加锁。
-
串行化(Serializable):可解决脏读、不可重复读、幻读问题,通过对表直接加锁的方式。
-
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
- 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专栏特点: 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构、数据库等一系列知识点,总结出了高频面试考点(附有答案)共计309道,事半功倍,为大家春秋招助力。 - 本专栏内容分为七章:共计309道高频面试题(附有答案)