java常见面试问题(四)

发布时间:2022-07-02 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了java常见面试问题(四)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

一、SPRingMVC执行流程

java常见面试问题(四)

1、用户发送一个请求过来,DispatcherServlet接收到请求后,将请求信息交给处理器映射器(HandlerMapping) 

2、HandlerMapping根据用户的Url请求,查找匹配url的Handler,并返回一个执行链

3、DispatcherServlet再请求处理适配器(HandlderAdpter)调用相应的Handler进行处理并返回ModelAndView给DisPatcherServlet

4、DispatcherServlet将ModelAndView请求ViewReslover(视图解析器)解析,返回具体View

5、DispatcherServlet对view进行渲染视图(即将模型数据填充到视图中),然后将页面响应回去

二、MySQL有哪几种数据存储引擎F1f;有什么区别?

mySQL中通过Show engines指令可以看到所有支持的数据库存储引擎。最为常用的就是MyISam和InnoDB两种。

MyISAM和InnoDB的区别:

1、myIsam是默认不支持事务的,InnoDB支持事务

2、myIsam不支持外键;InnoDB支持外键

3、myIsam支持表级锁(不支持高并发,以读为主);InnoDB支持行锁,但在执行不能确定范围的Sql语句时,InnoDB同样会锁全表

4、myIsam在磁盘存储上有三个文件.frm(存储表定义) .myd(存储表数据) .myi(存储表索引);innoDB磁盘存储的是表空间数据文件和日志文件,innoDB表大小只受限于操作系统大小 。

5、myisam使用非聚集索引,索引和数据分开,只缓存索引;innoDB使用聚集索引,索引和数据存在一个文件。

6、myisam保存表具体行数,innodb不保存

三、什么是脏读、幻读、不可重复读?要怎么处理?

这些问题都是mysql进行事务并发控制时经常遇到的问题

脏读:在事务进行过程中,读到了其他事务未提交的数据

不可重复读:在一个事务过程中,多次查询的结果不致

幻读:在一个事务过程中,用同样的操作查询数据,得到的记录数不相同

处理的方式有:加锁、事务隔离

加锁:

1、脏读:在修改时加排他锁,直到事务提交才释放。读取时加共享锁,读完释放锁

2、不可重复读:读数据时加共享锁,写数据加排他锁

3、幻读:加范围锁

事务隔离:

未提交读(read uncommITted):允许脏读

读已提交(read Committed):只能读取到已经提交的数据

可重复读(RePEated Read):可重复读。在同一个事务的查询都是事务开始时刻一致的

序列化(Serializable):每次读都需要获得表级共享锁,读写相互阻塞

四、事务的基本特征和隔离级别有哪些

事务:表示多个数据操作组成一个完整的事务单元,这个事务内的所有数据操作要么同时成功,要么同时失败。

事务的特征:ACID

1、原子性:事务是不可分割的,要么完全成功,要么完全失败。

2、一致性:事务无论是完成还是失败,都必须保持事务内操作的一致性。当失败时,都要对前面的操作进行回滚,不管中途是否成功

3、隔离性:当多个事务操作一个数据的时候,为止数据损坏,需要将每个事务进行隔离,互相不干扰。

4、持久性:事务开始就不会终止,他的结果不受其他外在因素的影响。

事务的隔离级别:show VARiables like 'transaction%'

设置隔离级别:set transaction level xxx 设置下次事务的隔离级别。

set session transaction level xxx 设置当前会话的事务隔离级别

set global transaction level xxx 设置全局事务隔离级别

Mysql当中有五种隔离级别:

NONE:不使用事务

未提交读(read uncommitted):允许脏读

读已提交(read Committed):只能读取到已经提交的数据

可重复读(Repeated Read):可重复读。在同一个事务的查询都是事务开始时刻一致的

串行化(Serializable):每次读都需要获得表级共享锁,读写相互阻塞

五、Mysql的锁有哪些?什么是间隙锁?

从锁的粒度来区分

1、行锁:加锁粒度小,但是加锁资开销比较大。InnoDB支持

共享锁:读锁。多个事务可以对同一个数据共享同一把锁。持有锁的事务都可以访问数据,但是只读不能修改。select XXX LOCK IN SHARE MODE.

排他锁:写锁。只有一个事务能够获得排他锁,其他事务都不能获取该行的锁。InnoDB会对update/delete/insert语句自动添加排他锁。selete xxx for update

自增锁:通常是针对Mysql当中的自增字段。如果有事务回滚这种情况,数据会回滚,但是自增序列不会回滚

2、表锁:加锁粒度大,加锁资源开销比较小。MyIsam和InnoDB都支持

表共享读锁

表排他写锁

意向锁:是InnoDB自动添加的一种锁,不需要用户干预

3、全局锁:Flush tables with read lock。加锁之后整个数据库实例都处于只读状态。所有的数据变更操作都会被挂起,一般用于全库备份的时候

常用的锁算法:user :userId(1,4,9)  

1、记录锁:锁一条具体数的据

2、间隙锁:例:update user set xxx='xxx' where userId=5;在可重复读的隔离级别下,间隙锁锁锁住userId从5到9。锁一定的范围,而不锁具体的记录,是为了防止产生幻读

3、Next-key:间隙锁+右记录锁

六、Mysql的索引结构是什么样的?聚簇索引和非聚簇索引又是什么?

二叉树-》AVL树-》经黑树-》B-树-》B+树

二叉树:每个节点最多只有两个子节点,左边的子节点都当前节点小,右边的子节点都比当前大。

AVL树:树中任意节点的两个子树的高度差最大为1

红黑树:1、每个节点都是红色或者黑色。2、根节点是黑色。3、每个叶子节点都黑色的空节点。4、红色节点的父子节点都必须是黑色的。5、从任一节点到其每个叶子节点的所有路径都包含相同的黑色节点。

B-树:1、B-树的每个非叶子节点的子节点的个数都不会超过D(这个D就是B-树的阶) 2、所有的叶子节点都在同一层。3、所有节点关键字都按照递增顺序排序

B+树:1、非叶子节点不存储数据,只进行数据索引。2、所有数据都存储在叶子节点当中。3、每个叶子节点都存有相邻叶子节点的指针。4、叶子节点按照本身关键字从小到大排序

聚簇索引就是数据和索引是在一起的。

MyIsam使用的是非聚簇索引,树的子节点上的data不是数据本身,而是数据存放的地址。InnoDB采用的是聚簇索引,树的叶子节点上data就是数据本身

聚簇索引的数据物理存放顺序和索引顺序是一致的,所以一个表当中只能有一个聚簇索引,而非聚簇索引可以有多个

InnoDB中,如果表定义了主键,那主键就是聚簇索引。如果没有主键,就会找第一个非空unique列作为聚簇索引。否则,InnoDB会创建一个隐藏的row-id作为聚簇索引。

七、Mysql的集群是如何搭建的?读写分离是怎么做的?

Mysql通过将主节点的BinLOG同步给从节点完成主从之间的数据同步。

MySql的主从集群只会将binlog从主节点同步到从节点,而不会反过来同步。由此也就引申出了读写分离的问题。

因为要保证主从之间的数据一致,写数据的操作只能在主节点完成,而读数据的操作,可以在主节点或者从节点上完成。

脚本宝典总结

以上是脚本宝典为你收集整理的java常见面试问题(四)全部内容,希望文章能够帮你解决java常见面试问题(四)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。