一文彻底读懂优秀开源产品MyBatis一级缓存设计( 二 )
代码如下:
@Testpublic void testUpdate() throws IOException {try (SqlSession sqlSession = sqlSessionFactory.openSession()) {// 同一个会话 第一次查询System.out.println("第一次会会话的 第一次查询");OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);List
日志信息如下:
文章插图
分析:第一次查询打印了 sql 日志 , 然后进行数据更新 , 最后进行第二次查询发现仍旧查询数据库 , 说明缓存已经失效 。
结论:同一个会话如果有更新操作则缓存清除 。
3、导致脏数据
模拟思路:打开两个会话 , 第一个会话查询数据库获取数据后, 接着第二个会话修改数据 , 最后第一个会话再查询数据 , 那最后这次查询如果和第一次查询相同 , 那说明一级缓存会导致脏数据问题 。
代码如下:
@Testpublic void testDirtyData() throws IOException {SqlSession sqlSession1 = sqlSessionFactory.openSession(true);SqlSession sqlSession2 = sqlSessionFactory.openSession(true);try {// 同一个会话 第一次查询OrderMapper orderMapper1 = sqlSession1.getMapper(OrderMapper.class);OrderMapper orderMapper2 = sqlSession2.getMapper(OrderMapper.class);List
日志信息如下:
文章插图
分析:第一个会话第一次查询 amount 值是1212 , 第二会话将 amount 更改为666 , 第一个会话再次查询数据获取的 amount 值为1212 , 这说明第一个会话的第二次查询命中缓存导致了脏数据问题 。
结论:一级缓存在多会话中会导致脏数据 。
解决方式:在配置一级缓存作用范围的时候将其设置为 STATEMENT , 那么缓存仅对当前执行的语句有效 , 当语句执行完毕后 , 缓存就会被清空 。
设置方式:
【一文彻底读懂优秀开源产品MyBatis一级缓存设计】
- 当初|这是我的第一部华为手机,当初花6799元买的,现在“一文不值”?
- 荣耀V30|麒麟990+40W快充,昔日猛将彻底沦为清仓价?网友:太遗憾
- 美国|印度宣布彻底突破5G难关,美英加澳一片欢呼,一周后白宫怒斥被骗
- 大战|一亿像素平民化,Redmi掀起千元机大战,卢伟冰彻底让友商绝望!
- 小米10纪念至尊版|小米彻底疯狂!米10至尊只卖4690!米粉不约吗?
- 流畅|手机里垃圾太多,关闭这个开关,彻底清除垃圾,手机立刻流畅
- 海淘|收到海淘包裹如何降低病毒感染风险?专家回应:手要彻底清洗
- 快充|从小米10 Ultra换成iPhone 12 Pro一周后,我彻底后悔了
- 读懂|一图读懂冷链食品物流防控
- 只需2步,彻底关闭电脑里的弹窗广告,建议收藏