脚本宝典收集整理的这篇文章主要介绍了java常见面试问题(四),脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
一、SPRingMVC执行流程
1、用户发送一个请求过来,DispatcherServlet接收到请求后,将请求信息交给处理器映射器(HandlerMapping)
2、HandlerMapping根据用户的Url请求,查找匹配url的Handler,并返回一个执行链
3、DispatcherServlet再请求处理适配器(HandlderAdpter)调用相应的Handler进行处理并返回ModelAndView给DisPatcherServlet
4、DispatcherServlet将ModelAndView请求ViewReslover(视图解析器)解析,返回具体View
5、DispatcherServlet对view进行渲染视图(即将模型数据填充到视图中),然后将页面响应回去
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,请注明来意。