Java面试题解析(事务+缓存+数据库+多线程+JVM)

事务

一、什么是事务?事务的特性(ACID)

什么是事务:事务是程序中一系列严密的操做,全部操做执行必须成功完成,不然在每一个操做所作的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。

事务特性分为四个:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)简称ACID。算法

  • 一、原子性:事务是数据库的逻辑工做单位,事务中包含的各操做要么都作,要么都不作。
  • 二、一致性:事务执行的结果必须是使数据库从一个一致性状态变到另外一个一致性状态。所以当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。若是数据库系统运行中发生故障,有些事务还没有完成就被迫中断,这些未完成事务对数据库所作的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
  • 三、隔离性:一个事务的执行不能其它事务干扰。即一个事务内部的操做及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 四、持久性:也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操做或故障不该该对其执行结果有任何影响。


二、事务的隔离级别有几种,最经常使用的隔离级别是哪两种?

并发过程当中会出现的问题:

丢失更新:是不可重复读的特殊状况。若是两个事物都读取同一行,而后两个都进行写操做,并提交,第一个事物所作的改变就会丢失。

脏读:一个事务读取到另外一个事务未提交的更新数据。

幻读也叫虚读:一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,形成两次结果不一致,只是另外一个事务在这两次查询中间插入或删除了数据形成的。

不可重复读:一个事务两次读取同一行的数据,结果获得不一样状态的结果,中间正好另外一个事务更新了该数据,两次结果相异,不可被信任。

事务的隔离级别有4种:

一、未提交读(Read uncommitted)

定义:就是一个事务读取到其余事务未提交的数据,是级别最低的隔离机制。

缺点:会产生脏读、不可重复读、幻读。

二、提交读(Read committed)

定义:就是一个事务读取到其余事务提交后的数据。Oracle默认隔离级别。

缺点:会产生不可重复读、幻读。

三、可重复读(Repeatable read)

定义:就是一个事务对同一份数据读取到的相同,不在意其余事务对数据的修改。MySQL默认的隔离级别。

缺点:会产生幻读。

四、串行化(Serializable)

定义:事务串行化执行,隔离级别最高,牺牲了系统的并发性。

缺点:能够解决并发事务的全部问题。可是效率地下,消耗数据库性能,通常不使用。



缓存

三、分布式缓存的典型应用场景?

页面缓存,用来缓存Web页面的内容片断,包括HTML、CSS 和图片等,多应用于社交网站等。

应用对象缓存,缓存系统做为ORM框架的二级缓存对外提供服务,目的是减轻数据库的负载压力,加速应用访问。

状态缓存,缓存包括Session会话状态及应用横向扩展时的状态数据等,这类数据通常是难以恢复的,对可用性要求较高,多应用于高可用集群。

并行处理,一般涉及大量中间计算结果须要共享。

事件处理,分布式缓存提供了针对事件流的连续查询(continuous query)处理技术,知足实时性需求。

极限事务处理,分布式缓存为事务型应用提供高吞吐率、低延时的解决方案,支持高并发事务请求处理,多应用于铁路、金融服务和电信等领域。

数据库

四、MongoDB与Mysql的区别?

两种数据库的区别:

传统的关系型数据库,数据是以表单为媒介进行存储的。

相比较Mysql,Mongodb以一种直观文档的方式来完成数据的存储。

Mongodb的鲜明特征:

自带GirdFS的分布式文件系统,这也为Mongodb的部署提供了很大便利。

Mongodb内自建了对map-reduce运算框架的支持,虽然这种支持从功能上看还算是比较简单的,至关于MySQL里GroupBy功能的扩展版,不过也为数据的统计带来了方便。

Mongodb在启动后将数据库中得数据以文件映射的方式加载到内存中,若是内存资源至关丰富的话,这将极大的提升数据库的查询速度。

Mongodb的优点:

Mongodb适合那些对数据库具体格式不明确或者数据库数据格式常常变化的需求模型,并且对开发者十分友好。

Mongodb官方就自带一个分布式文件系统,Mongodb官方就自带一个分布式文件系统,能够很方便的部署到服务器机群上。

Mongodb的缺陷:

事务关系支持薄弱。这也是全部NoSQL数据库共同的缺陷,不过NoSQL并非为了事务关系而设计的,具体应用仍是很需求。

稳定性有些欠缺

方便开发者的同时,对运维人员提出了更高的要求。

Mongodb的应用场景:

表结构不明确且数据不断变大:MongoDB是非结构化文档数据库,扩展字段很容易且不会影响原有数据。内容管理或者博客平台等,例如圈子系统,存储用户评论之类的。

更高的写入负载:MongoDB侧重高数据写入的性能,而非事务安全,适合业务系统中有大量“低价值”数据的场景。自己存的就是json格式数据。例如作日志系统。

数据量很大或者未来会变得很大:Mysql单表数据量达到5-10G时会出现明细的性能降级,须要作数据的水平和垂直拆分、库的拆分完成扩展,MongoDB内建了sharding、不少数据分片的特性,容易水平扩展,比较好的适应大数据量增加的需求。

高可用性:自带高可用,自动主从切换(副本集):

不适用的场景:

MongoDB不支持事务操做,须要用到事务的应用建议不用MongoDB。

MongoDB目前不支持join操做,须要复杂查询的应用也不建议使用MongoDB。

在带“_id”插入数据的时候,MongoDB的插入效率其实并不高。若是想充分利用MongoDB性能的话,推荐采起不带“_id”的插入方式,而后对相关字段做索引来查询。

关系型数据库和非关系型数据库的应用场景对比:

关系型数据库适合存储结构化数据,如用户的账号、地址:

这些数据一般须要作结构化查询,好比join,这时候,关系型数据库就要胜出一筹。

这些数据的规模、增加的速度一般是能够预期的。

事务性、一致性。

NoSQL适合存储非结构化数据,如文章、评论:

这些数据一般用于模糊处理,如全文搜索、机器学习。

这些数据是海量的,并且增加的速度是难以预期的。

根据数据的特色,NoSQL数据库一般具备无限(至少接近)伸缩性。

按key获取数据效率很高,可是对join或其余结构化查询的支持就比较差。

五、Mysql索引相关问题。

1)什么是索引?

索引实际上是一种数据结构,可以帮助咱们快速的检索数据库中的数据。

2)索引具体采用的哪一种数据结构呢?

常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,一般使用的是InnoDB引擎,默认的是B+树。

3)InnoDb内存使用机制?

Innodb体系结构如图所示:



Innodb关于查询效率有影响的两个比较重要的参数分别是innodb_buffer_pool_size,innodb_read_ahead_threshold:

innodb_buffer_pool_size指的是Innodb缓冲池的大小,该参数的大小可经过命令指定innodb_buffer_pool_size 20G。缓冲池使用改进的LRU算法进行管理,维护一个LRU列表、一个FREE列表,FREE列表存放空闲页,数据库启动时LRU列表是空的,当须要从缓冲池分页时,首先从FREE列表查找空闲页,有则放入LRU列表,不然LRU执行淘汰,淘汰尾部的页分配给新页。

innodb_read_ahead_threshold相对应的是数据预加载机制,innodb_read_ahead_threshold 30表示的是若是一个extent中的被顺序读取的page超过或者等于该参数变量的,Innodb将会异步的将下一个extent读取到buffer pool中,好比该参数的值为30,那么当该extent中有30个pages被sequentially的读取,则会触发innodb linear预读,将下一个extent读到内存中;在没有该变量以前,当访问到extent的最后一个page的时候,Innodb会决定是否将下一个extent放入到buffer pool中;能够在Mysql服务端经过show innodb status中的Pages read ahead和evicted without access两个值来观察预读的状况:Innodb_buffer_pool_read_ahead:表示经过预读请求到buffer pool的pages;Innodb_buffer_pool_read_ahead_evicted:表示因为请求到buffer pool中没有被访问,而驱逐出内存的页数。

能够看出来,Mysql的缓冲池机制是能充分利用内存且有预加载机制,在某些条件下目标数据彻底在内存中,也可以具有很是好的查询性能。

4)B+ Tree索引和Hash索引区别?

哈希索引适合等值查询,可是没法进行范围查询。

哈希索引没办法利用索引完成排序。

哈希索引不支持多列联合索引的最左匹配规则。

若是有大量重复键值的状况下,哈希索引的效率会很低,由于存在哈希碰撞问题。

5)B+ Tree的叶子节点均可以存哪些东西吗?

InnoDB的B+ Tree可能存储的是整行数据,也有多是主键的值。

6)这二者有什么区别吗?

在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引。

7)聚簇索引和非聚簇索引,在查询数据的时候有区别吗?

聚簇索引查询会更快,由于主键索引树的叶子节点直接就是咱们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值之后,还须要再经过主键的值再进行一次查询。

8)主键索引查询只会查一次,而非主键索引须要回表查询屡次(这个过程叫作回表)。是全部状况都是这样的吗?非主键索引必定会查询屡次吗?

覆盖索引(covering index)指一个查询语句的执行只用从索引中就可以取得,没必要从数据表中读取。也能够称之为实现了索引覆盖。当一条查询语句符合覆盖索引条件时,MySQL只须要经过索引就能够返回查询所须要的数据,这样避免了查到索引后再返回表操做,减小I
 sql

相关文章
相关标签/搜索