[4]Java开发实习面试打卡
Posted Leida_wanglin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[4]Java开发实习面试打卡相关的知识,希望对你有一定的参考价值。
1.事务
1.1.什么是数据库事务?
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行结果必须使数据库从一种一致性状态变到另一种一致性状态.事务是逻辑上的一组操作,要么都执行,要么都不执行.
1.2.事务的四大特性(ACID)
- 原子性:事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用.
- 一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的.
- 隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的.
- 持久性:一个事务被提交之后.它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响.
1.3.什么是脏读?幻读?不可重复读?
-
脏读:某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的.
-
例子:小明读取到小红提交的100数据,但是小红异常回滚了数据,100变成90,这个时候小明还是100,但实际是90(脏读)
-
不可重复读:在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据.
-
例子:小明多次读取A数据,小红在小明读取数据时,每次读取都修改了数据并提交,小明多次读到的数据不一致
-
幻读:在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的.
-
例子:小明修改了A,B数据,小红同时又插入了一条C数据,小明会感觉自己明明数据都改了,突然多出来一条,以为出现了幻觉自己漏了一条.
1.4.什么是事务的隔离级别?mysql的默认隔离级别是什么?
为了达到事务的四大特性,数据库定义了4种不同的事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read-uncommitted | √ | √ | √ |
read-committed | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
SQL标准定义了四个隔离级别:
- read-uncommitted(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读,幻读,不可重复读.
- read-committed(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生.
- repeatable-read(可重复读):对同一字段的多次结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生.
- serializable(可串行化): 最高的隔离级别,完全服从ACID的隔离级别.所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读,不可重复读以及幻读.
Mysql默认采用repeatable_read隔离级别,Oracle默认采用read_committed隔离级别
事务隔离机制的实现基于锁机制和并发调度.并发调度使用的是MVVC(多版本并发控制),通过保存修改的旧版本信息来支持并发一致性读和回滚等特性.
2.锁
2.1.隔离级别与锁的关系
在read uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突
在read commited级别下,读操作需要加共享锁,但是在语句执行万以后释放共享锁.
在repeatable read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁.
serializable是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成.
2.2.按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法
在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)
,表级锁(MYISAM引擎)
和页级锁(BDB引擎)
-
行级锁:行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的开销也最大.
行级锁分为共享锁和排他锁.
特点:开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高. -
表级锁:表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持.
表级锁定分为共享读锁(共享锁)与表独占写锁(排他锁)
特点:开销小,加锁快,不会出现死锁.锁定力度大,发生锁冲突的概率最高,并发度最低. -
页级锁:页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁.表级锁速度快,但冲突多,行级冲突,=少,但速度慢.所以取了折衷的页级,一次锁定相邻的一组记录.
特点:开销和加锁时间界于表锁和行锁之间,会出现死锁.锁定粒度界于表锁和行锁之间,并发度一般.
2.3.MySQL中InnoDB引擎的行锁是怎么实现的?
InnoDB是基于索引来完成行锁
例:select * from tab_with_index where id=1 for update;
for update 可以根据条件来完成行锁锁定,并且id是有索引键的列,如果id不是索引键那么InnoDB将完成表锁,并发将无从谈起
2.4.什么是死锁?怎么解决?
死锁是指两个或多个事务在同一资源上互相占用,并请求锁定对方的资源,从而导致恶性循环的现象.
常见的解决死锁的方法
- 如果不同程度会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会.
- 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率.
- 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率.
如果业务处理不好可以用分布式事务或使用乐观锁
2.5.数据库的乐观锁和悲观锁是什么?怎么实现的?
数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性.
- 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作.在查询完数据的时候就把事务锁起来,直到提交事务.
实现方式:使用数据库中的锁机制
. - 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性.在修改数据的时候把事务锁起来,通过version的方式进行锁定.
实现方式:一般会使用版本号机制或CAS算法实现
3.视图
3.1. 为什么要使用视图?什么是视图?
为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性.所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据.但是,视图并不在数据库中以储存的数据值形式存在.行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成.
4.存储过程与函数
4.1. 什么是存储过程?有哪些优缺点?
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次.如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快.
优点
1.存储过程都是预编译过的,执行效率高.
2.存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯.
3.安全性高,执行存储过程需要有一定权限的用户.
4.存储过程可以重复使用,减少数据库开发人员的工作量
缺点
1.调试麻烦
2.移植问题
3.重新编译问题
4.维护问题
5.触发器
5.1. 什么是触发器?触发器的使用场景有哪些?
触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程.触发器是指一段代码,当触发某个事件时,自动执行这些代码.
使用场景
- 可以通过数据库中的相关表实现级联更改.
- 实时监控某张表中的某个字段的更改而需要做出相应的处理.
- 例如可以生成某些业务的编号
- 注意不要滥用,否则会造成数据库及应用程序的维护困难.
以上是关于[4]Java开发实习面试打卡的主要内容,如果未能解决你的问题,请参考以下文章