Talk is cheap, Show me the code.

void test() {/*** 一级缓存的作用范围session*/try (SqlSession session = sqlSessionFactory.openSession()) {User user = new User();user.setId(6);user.setName("test6");int i = session.insert("addUser", user);assertEquals(i, 1);/*** 本次是从数据库直接读取的,读取之后会存到一级缓存** 没有存入二级缓存,二级缓存需要session.commit()之后才会才会真正保存* 这也是为什么此处二级缓存没有脏数据的原因** 这里数据库的事务隔离级别是读未提交,所以可以读取到六条数据*/List<Object> allUsers = session.selectList("getAllUsers");assertEquals(allUsers.size(), 6);//      session.commit();/*** 这次是直接从一级缓存读取的数据,属于脏数据* 因为session还没有提交,数据随时有可能回滚*/List<Object> allUsers2 = session.selectList("getAllUsers");assertEquals(allUsers2.size(), 6);session.rollback();}/*** * 二级缓存的作用范围:应用程序启动后的一个namespace* * 数据回滚之后,依然只读到五条,说明刚才读取的是脏数据*/try (SqlSession session = sqlSessionFactory.openSession()) {List<Object> allUsers = session.selectList("getAllUsers");assertEquals(allUsers.size(), 5);}}

运行日志:

解决mybatis数据脏读方法:

  1. 彻底关闭一级缓存和二级缓存
  2. 既然使用一级缓存就不能避免脏数据,我们只有记住只有session提交(session.close方法会执行commit操作)之后读到的数据才可以使用,就能避开这个坑。
  3. 如果在分布式系统中二级缓存就可能造成脏数据,我们可以使用redis作为缓存嵌入mybatis,这样就可以解决二级缓存脏读问题。

mybatis一级缓存和二级缓存数据脏读问题相关推荐

  1. mybatis一级缓存、二级缓存以及集成EnCache、Redis,避免脏读

    参考书目:<mybatis从入门到精通> 刘增辉  著 作者GitHub:https://github.com/abel533/MyBatis-Spring-Boot 一级缓存 mybat ...

  2. MyBatis框架:延迟加载策策略、一级缓存、二级缓存

    MyBatis框架:延迟加载策略和缓存 Mybatis 延迟加载策略 1.1 何为延迟加载? 1.2 实现需求 1.3 使用association实现延迟加载 1.3.1 账户的持久层DAO接口 1. ...

  3. Mybatis 详解--- 一级缓存、二级缓存

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据 ...

  4. MyBatis中的一级缓存和二级缓存介绍

    先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能. 一级缓存 一级 ...

  5. mybatis 详解------ 一级缓存、二级缓存(九)

    mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMa ...

  6. java mysql 二级缓存_深入理解MyBatis中的一级缓存与二级缓存

    http://blog.csdn.net/weixin_36380516/article/details/73194758 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中 ...

  7. 肝了一早上,终于把mybatis的一级缓存和二级缓存原理搞懂了~

    今天的沉淀,是助力明天飞向远方的基石~ 每当自己沉思下来写学习文章的时候,内心深处总是会得到一片宁静. 缓存的概念 我们在查询数据时,经常去查询一些条件相同.数据的正确与否对最终结果影响不大的数据,并 ...

  8. Mybatis一级缓存与二级缓存的区别你知道吗

    前言 Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别. Mybatis缓存 缓存就是内存中的数据,常常来自对数据库查询结果的保存, ...

  9. mybatis中一级缓存和二级缓存

    1.一级缓存 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据.不同的sqlSessio ...

最新文章

  1. 论文推荐:ReLICv2 ,新的自监督学习能否在ResNet 上超越监督学习?
  2. 必看2019年学员信息系统项目管理师长篇备考经验
  3. Oracle入门(十四.7)之良好的编程习惯
  4. java星座测试需求分析_java十二星座 (快来测试你是什么星座吧)
  5. 基于JavaWeb实现的研究室综合系统
  6. bulk insert 总结
  7. 为何浙江天搜科技这些互联网企业对杭州情有独钟?
  8. echarts+vue3实战(1)
  9. 基于CISe@ZnS新型近红外二区量子点生物探针(CuInS2/ZnS量子点,Cd掺杂ZnO量子点,InP/ZnS,荧光Ag2S量子点)
  10. R语言绘制股票K线图
  11. mysql iops nvme_硬盘性能指标之一的IOPS,今天带你看懂
  12. 怎么把柱形图和折线图放在一起_EXCEL中统计图表怎么合并在一起?(如柱形图和折线图)...
  13. Android系统 lk启动流程简析
  14. yun mysql 安装_yun安装mysql
  15. 机器学习之MATLAB代码--SMA_LSSVM(十一)
  16. A branch-and-price approach to the feeder network design problem
  17. 1919.8.29顺丰科技编程题(所有岗位一样)
  18. 2020美团点评暑期实习一面
  19. 《孙子兵法战场机变之九变篇》
  20. 摇骰子小程序源码_喝酒聚会怕冷场,就找摇塞子小程序!

热门文章

  1. Linux 系统管理员
  2. mysql 自动生成时间戳
  3. 高德地图的基础使用(一)显示地图
  4. Scratch中的变量
  5. 用JSP/Servlet构建三层式管理信息系统
  6. 从零开始搭建服务器之登录和登出远程服务器
  7. 图形使用计算机绘制的画面,本章练习优质课教学设计
  8. python、matplotlib画箱体图检验异常值
  9. vue使用天气API接口
  10. (64)-- 爬取58同城网页信息