目录
目录
笔记
1.前端循环中 key的作用
当数据发生变化时 只需要重新渲染变化的数据,否则需要重新渲染全部数据。
面试题
1.什么是乐观锁,悲观锁 。乐观锁的使用场景
乐观锁是一种并发控制机制,它假设在修改数据时不会发生冲突,只在提交修改时检查是否有冲突。
乐观锁使用场景,用于处理多线程或多用户环境下的数据更新问题:例如在进行库存管理时,当并发量比较大的情况下,会出现两个或多个用户同时操作一个库存表,在没有加锁的情况下, 后操作的用户会把前操作的用户的操作覆盖,最后更新的是最后一位用户的操作。
方法:版本号机制:每次数据被修改时,版本号都会增加。当一个事务开始更新数据时,不仅会根据当前版本号来更新数据,还会将版本号+1。提交事务前,会再次检查版本号是否仍然与最初读取时一致,如果一致则提交更新,否则表示有其他事务在此期间修改过数据,因此当前事务回滚,重新尝试获取最新的数据后再执行更新操作。
悲观锁则是一种预防性的锁定机制,它在数据处理前就对数据进行加锁。
2.sql优化
索引失效:
(1)查询条件包含or,可能导致索引失效
(2)如何字段类型是字符串,where时一定用引号括起来,否则索引失效
(3)like查询以%开头(当满足覆盖索引的条件下,不会失效)
(4)联合索引,需要符合最佳左前缀原则,查询时的条件列不是联合索引中的第一个列,索引失 效。并且不能跳过联合索引中的任何一个。
(5)在索引列上使用mysql的内置函数,索引失效。
(6)对索引列运算(如,+、-、*、/),索引失效。
(7)索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
(8)索引字段上使用is null, is not null,可能导致索引失效。
(9)左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
(10)mysql估计使用全表扫描要比使用索引快,则不使用索引
3.Spring事务的原理
主要是基于AOP(面向切面编程)实现的。
Spring事务通过AOP技术,在方法执行的前后插入事务相关的操作。
通常通过代理模式实现,及在方法执行完成后提交或回滚事务。
4.事务失效的场景
- 非public修饰的方法
- 类内部访问
- 数据库不支持事务
- 异常类型不匹配
- 传播属性设置问题
- 捕获异常未抛出
- Bean没有纳入Spring IOC容器管理
- 事务方法内启动新线程进行异步操作
5.事务注解的参数
REQUIRED 默认,如果存在事务,则支持当前事务;不存在则开启一个新事务
REQUIRES_NEW 不管存在不存在,都开启一个新事务
NESTED 如果不存在事务,则开启一个事务运行;如果存在事务,则运行一个嵌套事务
NEVER 非事务方式执行,如果存在事务,则抛异常
NOT_SUPPORTED 不管存不存在,都以非事务方式执行,当存在事务时,挂起事务
SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
6.JDBC执行流程
- 注册驱动
- 建立数据库连接
- 创建Statement对象
- 执行SQL查询或更新
- 处理结果集
- 关闭资源
7.MyBatis执行流程
- 读取MyBatis配置文件
- 加载映射文件
- 构造会话工厂
- 创建会话对象
- Execute执行器
- MappedStatement对象
- 输入参数映射ParameterHandle
- 输出结果映射ResultHandle
8.MyBatis的四种拦截器
- Executor (执行器拦截器): 拦截MyBatis执行器方法的执行
- StatementHandler(语句拦截器): 拦截SQL语句的执行
- ParameterHandler(参数拦截器): 拦截SQL语句的参数设置
- ResultHandler(结果拦截器): 拦截从SQL语句返回的结果集的处理
9.拦截时使用反射
遇到的使用场景:在使用MyBatis参数拦截器处理参数时,使用Hutoll工具中的ReflectUtil的getField(参数对象的class类,要拦截处理的参数名)方法获得要处理的参数的值
先进行非空判断,然后使用工具类中的setFieldValue对获得的对象进行处理
10.MyBatis拦截器的执行流程
- 创建自定义拦截器类:实现ibatis下的Intercepter接口,重写intercepter()方法
- 使用@Intercepters注解指定拦截目标,同时设置其参数@Signature()指定要拦截的方法签名
- 将当前类注入IOC容器中,使用@Component注解