关于如何禁用mybatis一级缓存请移步:https://mp.csdn.net/console/editor/html/106408985
上一篇文章记录了如何禁用mybatis一级缓存,但在mysql数据库下并不生效,现将分析结果及解决方案记录如下。
问题的引出:
在mysql数据库环境下验证禁用一级缓存效果时,发现现象如下:同一事物方法下第二次相同的sql查询打印出了sql语句,说明确实执行了数据库查询操作【如果使用缓存是不会在日志中有sql语句输出的】;但是返回的数据并没有体现出手工调整数据的变化,仍然和第一次查询的数据一致;
分析及结论:
通过观察到的现象表面禁用缓存的实际效果与使用缓存一致,但第二次查询日志又打印出了查询sql语句,说明禁用缓存是生效的,所以讲调查问题的思路转向了数据库事物隔离级别;
mysql的事物默认隔离级别是Repeatable Read(可重复读),该隔离级别确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
想要深入了解mysql可重复读机制,可参考文章:https://blog.csdn.net/qq_32573109/article/details/98610368
解决方案:
既然问题原因已经调查清楚,那么解决方案就很明显了,在事物注解上指定事物隔离级别为Repeatable Read(可重复读)即可【isolation = Isolation.READ_COMMITTED】。
明确指定事物隔离级别为Repeatable Read(可重复读)后,再次验证,第二次查询打印出sql语句,同时查询结果体现出手工修改数据的效果,问题解决。
本文详细解析在MySQL环境下禁用MyBatis一级缓存的复杂情况,探讨为何禁用缓存后仍出现重复读取相同数据的现象,并提供了解决方案,即通过设置事务隔离级别为可重复读来确保数据的一致性和准确性。

952

被折叠的 条评论
为什么被折叠?



