mybatis一级缓存和二级缓存数据脏读问题
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数据脏读方法:
- 彻底关闭一级缓存和二级缓存
- 既然使用一级缓存就不能避免脏数据,我们只有记住只有session提交(session.close方法会执行commit操作)之后读到的数据才可以使用,就能避开这个坑。
- 如果在分布式系统中二级缓存就可能造成脏数据,我们可以使用redis作为缓存嵌入mybatis,这样就可以解决二级缓存脏读问题。
mybatis一级缓存和二级缓存数据脏读问题相关推荐
- mybatis一级缓存、二级缓存以及集成EnCache、Redis,避免脏读
参考书目:<mybatis从入门到精通> 刘增辉 著 作者GitHub:https://github.com/abel533/MyBatis-Spring-Boot 一级缓存 mybat ...
- MyBatis框架:延迟加载策策略、一级缓存、二级缓存
MyBatis框架:延迟加载策略和缓存 Mybatis 延迟加载策略 1.1 何为延迟加载? 1.2 实现需求 1.3 使用association实现延迟加载 1.3.1 账户的持久层DAO接口 1. ...
- Mybatis 详解--- 一级缓存、二级缓存
2019独角兽企业重金招聘Python工程师标准>>> Mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据 ...
- MyBatis中的一级缓存和二级缓存介绍
先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能. 一级缓存 一级 ...
- mybatis 详解------ 一级缓存、二级缓存(九)
mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMa ...
- java mysql 二级缓存_深入理解MyBatis中的一级缓存与二级缓存
http://blog.csdn.net/weixin_36380516/article/details/73194758 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中 ...
- 肝了一早上,终于把mybatis的一级缓存和二级缓存原理搞懂了~
今天的沉淀,是助力明天飞向远方的基石~ 每当自己沉思下来写学习文章的时候,内心深处总是会得到一片宁静. 缓存的概念 我们在查询数据时,经常去查询一些条件相同.数据的正确与否对最终结果影响不大的数据,并 ...
- Mybatis一级缓存与二级缓存的区别你知道吗
前言 Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别. Mybatis缓存 缓存就是内存中的数据,常常来自对数据库查询结果的保存, ...
- mybatis中一级缓存和二级缓存
1.一级缓存 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据.不同的sqlSessio ...
最新文章
- 论文推荐:ReLICv2 ,新的自监督学习能否在ResNet 上超越监督学习?
- 必看2019年学员信息系统项目管理师长篇备考经验
- Oracle入门(十四.7)之良好的编程习惯
- java星座测试需求分析_java十二星座 (快来测试你是什么星座吧)
- 基于JavaWeb实现的研究室综合系统
- bulk insert 总结
- 为何浙江天搜科技这些互联网企业对杭州情有独钟?
- echarts+vue3实战(1)
- 基于CISe@ZnS新型近红外二区量子点生物探针(CuInS2/ZnS量子点,Cd掺杂ZnO量子点,InP/ZnS,荧光Ag2S量子点)
- R语言绘制股票K线图
- mysql iops nvme_硬盘性能指标之一的IOPS,今天带你看懂
- 怎么把柱形图和折线图放在一起_EXCEL中统计图表怎么合并在一起?(如柱形图和折线图)...
- Android系统 lk启动流程简析
- yun mysql 安装_yun安装mysql
- 机器学习之MATLAB代码--SMA_LSSVM(十一)
- A branch-and-price approach to the feeder network design problem
- 1919.8.29顺丰科技编程题(所有岗位一样)
- 2020美团点评暑期实习一面
- 《孙子兵法战场机变之九变篇》
- 摇骰子小程序源码_喝酒聚会怕冷场,就找摇塞子小程序!