1.MySQL数据库相关问题
去年面试了几家互联网公司,几乎都会问我数据库的相关问题,这里我做个总结,
问得最多的是事务失效,索引失效,索引的分类。下面我详细描述一下。
2 事务失效场景
- 事务方法没有被public修饰,@Transactional注解只能作用于public修饰的方法上。
- 方法内部自己捕捉了异常,未把异常抛出去,(如果自己把异常处理了,AOP就无法获取方法抛出的异常,就无法回滚。)。
- 事务注解使用了notsupport,不支持事务; @Transactional(propagation = Propagation.NOT_SUPPORTED)
- 未被Spring管理,事务方法所在的类没有被加载为一个bean,那么事务自然就失效了。
- 方法使用final修饰或static修饰,如果事务方法使用final或static修饰,那么aop就无法在代理类中重写该方法,事务就不会生效。
- 同一类中方法调用,如果一个方法调用有事务的方法也会失效,如果此时要解决,可以注入调用类本身,再进行对象.方法调用。
- 未开启事务,如果是传统的spring,则需要手动开启事务,如果是springboot项目,则DataSourceTransactionManagerAutoConfiguration自动配置类帮我们开启了事务。
- 数据库引擎使用错误,使用了不支持事务的存储引擎。比如mysql中的MyISAM
- 多线程调用,事务方法类,开启了多线程调用方式;、
10.事务所在的类,过早实例化,,就无法被AbstractAutoProxyCreator后置处理器增强。
3.索引失效
- 对于复合索引,不满足最左匹配原则。
- where后面字符没有引号 。
- like %百分号在左边。
- 索引列使用了函数,使用or关键字,使用not in,不等于。
- 使用了select*
- 使用is not null,not in和not exists
4 索引区别
1、主键索引:主键索引是一种特殊的唯一索引,不允许有空值
2、普通索引或者单列索引
3、多列索引(复合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合
4、唯一索引或者非唯一索引
5、空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建
- 唯一索引和普通索引:(唯一索引不允许索引列出现相同的数据,普通索引可以。在索引检索时,普通索引在查找到满足条件的第一个记录还会查找下一个记录,对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。)
- 唯一索引和主键的区别;(主键是可以做为其它表的外键的,唯一索引却不行做其他表外键的。一个表只能有一个主键,但唯一索引可以却可以有多个。唯一索引列允许为空值,主键却不能为空。)