目录
一. Java相关
1.1 多线程相关
1.2 JUC相关
1.3JVM相关
二.框架相关
2.1 Spring
Interceptor 与 Filter 的区别
-
相同点
- Spring 的Interceptor 与 Servlet 的 Filter 有相似之处,比如二者都是 AOP 编程思想的体现,
都能实现权限检查、日志记录等。
- Spring 的Interceptor 与 Servlet 的 Filter 有相似之处,比如二者都是 AOP 编程思想的体现,
-
不同点:
-
使用范围不同: Filter 是 Servlet 规范规定的,只能用于 Web 程序中。而Interceptor 既
可以用于 Web 程序,也可以用于 Application 、 Swing 程序中。 -
实现规范不同: Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的。而Interceptor 是
在 Spring 容器内的,是 Spring 框架支持的。 -
使用的资源不同:同其他的代码块一样,Interceptor 也是一个 Spring 的组件,归 Spring 管理,配置在 Spring 文件中,因此能使用 Spring 里的任何资源、对象,例如 Service 对象、数据源、事务管理等,通过 loC 注入到Interceptor 即可;而 Filter 则不能。
-
作用域深度不同: Filter 在只在 Servlet 前后、处理器前后起作用。而Interceptor 能够深入到方法前后、异常
抛出前后等,因此Interceptor 的使用具有更大的弹性。所以在 Spring 构架的程序中,要优先使用Interceptor 。
-
三. 中间件相关
3.1 Redis
四. MySQL相关
1、事务
1.1、事务的特性?
事务包括四大特性:ACID
-
A: 原子性 Atomicity(要么都成功!要么都失败!)
- 一个事务是一个单独的个体,不可拆分,有一个指令执行失败,事务进行回滚到执行整个指令执行之前的状态
-
C: 一致性:事务必须是保证多条DML语句同时成功或者同时失败 Consistenty
- 事务执行前后需要保证数据完整性(准确性和可靠性),像主键约束、not null 等等
-
I: 隔离性 Isolation
- 相对于并发访问时满足隔离性,事务A与事务B之间具有隔离
-
D: 持久性 Durability
- 事务执行完毕之后对数据的改变是永久的,即存储在磁盘中
1.2、关于事务之间的隔离性
链接:Immersive Reader (cnblogs.com)
MySQL数据库自动提交事务 :使用 start transaction 关闭自动提交机制。
MySQL默认级别:第三级别:可重复读
事务隔离性存在隔离级别,理论上隔离级别包括四个:
-
第一级别:读未提交
- 对方事务还没有提交,我们当前事务可以读取到对方未提交的数据,读未提交 存在脏读(Dirty Read)现象,表示读到了脏的数据
-
第二级别:读已提交
- 解决脏读--->读已提交导致不可重复读
- 不可重复读:一次事务相同查询返回不同的数据
-
第三级别:可重复读
- 解决不可重复读--->可重复读(导致幻读)
- 开始读取数据(事务开启)时,不再允许update操作,但是不能杜绝insert操作
- 使用了行级锁不可重复读:一次事务相同查询返回不同的数据
-
第四级别:序列化读/串行化读
- 使用表级锁,避免了所有问题,事务A与事务B串行,而不并发。
- 解决了所有问题。效率低。需要事务排队。
-
总结
- 幻读和不可重复读:幻读和不可重复读都是指的一个事务范围内的操作受到其他事务的影响了。
- 只不过幻读是重点在插入和删除,不可重复读重点在修改。
2、索引
2.1、索引的分类?
- 单一索引:给单个字段添加索引
- 复合索引:给多个字段联合起来添加1个索引
- 主键索引:主键上会自动添加索引
- 唯一索引:有unique约束的字段上会自动添加索引
- ····
2.2、索引什么时候失效?
select username from user where usename like '%zs%';
模糊查询的时候 使用了通配符 % 这个时候是失效的
3、数据库设计三范式
3.1、什么是设计范式?
设计表的依据。按照这个三范式设计的表不会出现数据冗余
3.2、三范式都是哪些?
-
第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分
-
第二范式:建立在第一范式的基础上,所有的非主键字段完全依赖主键,不产生部分依赖。
多对多?三张表,关系表两个外键
-
第三范式:建立在第一范式的基础之上,所有的非主键字段直接依赖主键,不能产生传递依赖。
一对多?两张表,多的表加外键