


1.使用spring提供的@transactional注解,在那些情况下会失效,你能讲讲为什么失效吗,如何解决
spring使用的是cglib(通过继承的方式)生成的代理类然后托管到spring. 切面主要关注的是切面这个方法而不是他的其他属性,所以实际上这个代理类调待增强的方法时是通过一个普通对象调的,并不是spring管理的对象,普通对象里面的方法调这个对象内部的方法这个注解肯定不生效.
解决办法
自己注入自己,生成的代理类是spring托管的,自然会进行依赖注入.
2.有做过mysql相关的优化吗 比如mysql配置,语句优化,取得的效果如何
对linux内核优化:backlog调整linux 下全连接(tcp三次握手中处于已建立连接状态会放到一个accept_queue中,等待被应用线程accept)的队列长度(服务器最大qps的1-1.5倍就合适了),能够提升负载.
对mysql配置优化:
- 对buffer_pool_size调整 70%
- 对instance调整小于内核数
- 对max_conection调整 通过查max_used_connection /16% 调整一个合适的最大连接数
还有一些针对磁盘种类的比如ssd的优化
对索引优化:拿慢日志用分析工具直接看sql 挨着挨着explain分析
对业务优化:业务逻辑减少不必要的查询(比如组织成员),sql语句优化
3.你能大概讲讲innodb的最左匹配原则吗,可以从联合索引的数据结构大概描述说下吗比如index(a,b,c)
b+树的结构 主键索引非叶子节点是主键,叶子结点是具体的数据(双向链表), 二级索引就是非叶子节点是索引列数据,叶子结点是主键.
index(a,b,c)在索引构建上,包含了两个意思: 1、先把各个记录按照 a 列进行排序。 2、在记录的 a 列相同的情况下,采用 b 列进行排序,在b列相同的情况下对c列排序
所以只有a列是全部有序,bc列都是局部有序
type顺序:system > const(主键或唯一索引与常数等值匹配) > eq_ref (连接查询时主键或唯一索引等值匹配)> ref(普通的二级索引列与常量进行等值匹配) > range (范围查找)> index (当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法 就是 index)> all
4.innodb如何实现事务的?
在事务的实现机制上,MySQL 采用的是 WAL(Write-ahead logging,预写式 日志)机制来实现的。
在使用 WAL 的系统中,所有的修改都先被写入到日志中,然后再被应用到 系统中。通常包含 redo 和 undo 两部分信息。
redo log 称为重做日志,每当有操作时,在数据变更之前将操作写入 redo log, 这样当发生掉电之类的情况时系统可以在重启后继续操作。
undo log 称为撤销日志,当一些变更执行到一半无法完成时,可以根据撤销 日志恢复到变更之间的状态。
MySQL 中用 redo log 来在系统 Crash 重启之类的情况时修复数据(事务的持久性),而 undo log 来保证事务的原子性(一致性是目的,原子性是手段)。
5.大致讲下mvcc的实现原理.
聚簇索引记录中包含两个必要的隐藏列trx_id(每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的事 务 id 赋值给 trx_id 隐藏列) , roll_pointer (每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到 undo 日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。)
所有的版本都会被 roll_pointer 属性连接成 一个链表,我们把这个链表称之为版本链,版本链的头节点就是当前记录最新的 值。另外,每个版本中还包含生成该版本时对应的事务 id。于是可以利用这个记录的版本链来控制并发事务访问相同记录的行为.
6.mvcc基本解决幻读,但是没有完全禁止,你能说说这种情况吗
T1没有读到这条记录,但还是对这条记录做了update操作,这时候肯定update不会报错,这条新插入的记录版本链上最新的就变成了T1的事务id,当然就可见了
7.mysql中的锁有了解吗,主要分为那些锁
按锁的模式分: 共享锁(s) 排它锁(x) 意向共享锁(is) 意向排它锁(ix)
按锁的算法分: 记录锁(锁当前记录) 间隙锁(锁他的前后间隙)(解决幻读RR隔离级别下才会有) 临键锁(锁当前记录和他的前面的间隙)
8.批量更新的时候有遇到过锁超时,死锁吗 为什么会产生,怎么解决批量更新下的存在的这种问题
1.原理:锁本质是锁的索引,所以不走索引都锁表,同理通过普通索引的批量更新会锁多行(加的间隙锁),造成死锁
解决方案:1.通过主键或唯一索引(具备唯一性,能够唯一确定一条记录的索引)更新 2.把事务级别改为rc
