数据库

2021/5/20 19:29:33

本文主要是介绍数据库,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

数据库的高级特性

一、Mysql 的存储引擎,myisam和innodb的区别?

InnoDB支持事务, MyISAM不支持.

InnoDB支持行级锁, MyISAM支持表级锁.

InnoDB支持多版本并发控制(MVVC), MyISAM不支持.

InnoDB支持外键, MyISAM不支持.

MyISAM支持全文索引, InnoDB不支持(但可以使用Sphinx插件)

二、什么是事务?

事务是逻辑上的一组操作,要么都执行,要么都不执行。

三、什么是事务的四大特性(ACID)?

原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;

一致性(Consistency): 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;

隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

四、并发事务会带来哪些问题?

脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。

丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。

不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

五、事务的隔离级别有哪些?

READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

六、MySQL由哪些部分组成, 分别用来做什么?

Server

连接器: 管理连接, 权限验证.

分析器: 词法分析, 语法分析.

优化器: 执行计划生成, 索引的选择.

执行器: 操作存储引擎, 返回执行结果.

存储引擎: 存储数据, 提供读写接口.

七、简要说一下数据库范式?

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

第二范式(2NF):要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。(在1NF基础上消除非主属性对主键的部分函数依赖)

第三范式(3NF):任何非主属性不依赖于其它非主属性。(在2NF基础上消除传递依赖)

八、说一下 HashMap 的实现原理?

HashMap基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将value 保存在 bucket 里。当计算出的 hash值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同hash值的value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

九、说一下 HashSet的实现原理?

HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap的相关方法来完成,HashSet不允许重复的值。

十、动态代理是什么?有哪些应用?

动态代理是运行时动态生成代理类。

动态代理的应用有 spring aop、hibernate 数据查询、测试框架的后端 mock、rpc,Java 注解对象获取等。

 

 

 

 

 

 

 

 

 

 

 

 



这篇关于数据库的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程