面试题(第一天)
1.数据库事务的四个特性及含义
数据库事务正确执行的四个基本要素。ACID,原子性、一致性、隔离性、持久性。
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
2.数据库优化
(1).数据分区储存
可以按照数据的存储时间。数据的地区等等进行分区。
(2)表索引
优点:
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
第一。对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
第二、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
(3)sql语句优化。
尽量避免全表查询,修改时尽量别修改全部字段,否则会引起明显的性能消耗等
3.mysql死锁
死锁:是指两个或两个以上的进程在执行过程中,因抢夺资源而互相等待的现在。此时系统称为死锁,这些永远在等待的进程叫死锁进程。
死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。
死锁的解决办法:查找出线程并将其杀死。设置锁的超时时间。指定获取锁的顺序
4.悲观锁、乐观锁
悲观锁特点:先获取锁,再进行业务操作。即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。
乐观锁:乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。
5.jvm内存原理
,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行
包含:程序计数器。java栈,本地方法栈,方法区,堆五大部分。
(1).程序计数器
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
(2).java栈(虚拟机栈)
每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息
(3).本地方法栈
本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务
(4).方法区
1、方法区是线程安全的。
2、方法区的大小不必是固定的,JVM可根据应用需要动态调整
3、方法区也可被垃圾收集,当某个类不在被使用时,JVM将卸载这个类,进行垃圾收集
(5)堆
堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
堆是垃圾收集器管理的主要区域。