- 乐观锁悲观锁区别 https://blog.csdn.net/weixin_43870079/article/details/102941288
- 悲观锁: 每次拿到数据就认为别人会修改数据, 每次拿到数据就会去上锁, 别的线程想拿到这个数据就会阻塞直到它拿到锁. 数据库中的行锁, 表锁等都是在操作前上锁. Java中的Synchronized 和ReentrantLock 也是悲观锁的思想.
- 乐观锁: 总是假设最好的情况, 每次拿数据都会认为别人不会去修改, 不会上锁, 但是在更新数据的时候, 会去判断一下别人有没有去更新这个数据, 可以使用版本号和cas算法去实现. 乐观锁适用于多读的场景, 可以提高吞吐量. 数据库的write_condition机制, 就是乐观锁. Java中的atomic包下面的原子变量类就是使用了乐观锁的一种cas实现.
- 乐观锁适用于冲突很少发生的读多写少的场景. 如果是多写的场景, 冲突较多, 适合悲观锁.
- MyISAM 和InnoDB 存储引擎使用的锁: MyISAM 使用的是表锁, InnoDB 默认行锁, 也支持表锁
- 表锁: 锁的粒度大, 对整张表加锁, 实现简单, 消耗资源少, 加锁快, 不会出现死锁, 触发冲突的概率高, 并发度低.
- 行锁: 锁粒度小, 只对当前操作的行加锁, 减少冲突, 并发度高, 但加锁开销大, 加锁慢, 会出现死锁.
- 讲一讲aop https://javaweixin6.blog.csdn.net/article/details/117512141
- SpringBoot启动流程
- RocketMQ怎么实现高可用
- MySQL更新修改数据的时候, 索引会有什么操作
- 为什么重写hashCode和equals方法
- Mybatis的多级缓存
-
Mybatis 的一级缓存生命周期和SqlSession的一致 ( 一级缓存又叫LocalCache 缓存 ). 每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。 图片来源 https://tech.meituan.com/2018/01/19/mybatis-cache.html 客户端发送请求到数据库, Sql Session 去找Executor, Executor 去找Cache缓存, 如果找到了, 那么直接返回结果, 如果找不到, 那么再去数据库中查询, 并且把缓存放入 cache中.
-
Mybatis 的一级缓存是一个没有容量限定的HashMap, 在缓存的功能上有所欠缺
-
Mybatis 的一级缓存最大范围是SqlSession内部, 有多个SqlSession或分布式环境下, 数据库写操作会引起脏数据, 建议将缓存级别 设定为Satement(每次查询, 都去数据库中查). 一级缓存避坑 一级缓存与二级缓存 延迟加载
-
MyBatis 二级缓存, 是实现了SqlSession之间缓存数据的共享, 粒度更加的细, 能够做到namespace级别, 通过cache接口实现类不同的组合, 对cache的可控性更强.
-
MyBatis 多表查询, 可能会出现脏数据, 有设计的缺陷, 安全使用二级缓存条件比较苛刻.
-
分布式环境下, 默认的MyBatis cache实现都是基于本地的, 分布式环境会出现读到脏数据, 需要使用集中式缓存, 将mybatis 的cache接口实现, 有一定的开发成本, 直接使用Redis, memcached等分布式缓存, 成本更低 , 安全性更高. 个人建议MyBatis缓存特性在生产环境中进行关闭,单纯作为一个ORM框架使用可能更为合适。
-
- 乐观锁 与 悲观锁 使用场景 优缺点
- ScheduledThreadPoolExecutor 中ScheduleAtFixedRate 和 ScheduleWithFixedDelay方法 有什么区别
2021-06-03 面试题
关注
打赏