news 2026/7/21 10:24:02

在一个事务里面死循环select一条数据,当我开启事务时,数据是1,每过5秒我就select一次,这个时候mybatis的一级缓存起作用了,所以不会去数据库查数据,等别的线程更新了数据表的数据,会使m

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在一个事务里面死循环select一条数据,当我开启事务时,数据是1,每过5秒我就select一次,这个时候mybatis的一级缓存起作用了,所以不会去数据库查数据,等别的线程更新了数据表的数据,会使m

这个问题涉及到 MyBatis 一级缓存、事务隔离级别和数据库的并发控制。让我详细分析一下:

1. MyBatis 一级缓存的行为

MyBatis 一级缓存(Local Cache)是SqlSession 级别​ 的缓存:

  • 在同一个 SqlSession 中执行相同的查询,MyBatis 会返回缓存中的结果

  • 默认情况下,一级缓存是开启的

2. 重要结论

不会失效,原因如下:

2.1 MyBatis 一级缓存的失效条件

MyBatis 一级缓存会在以下情况下失效:

  • 执行了 INSERT/UPDATE/DELETE 操作

  • 调用了sqlSession.clearCache()方法

  • 执行了带有flushCache="true"的查询

  • SqlSession 关闭

但是其他线程的更新不会导致当前线程的 MyBatis 一级缓存失效,因为一级缓存是 SqlSession 私有的。

3. 实际演示代码

@Service public class DemoService { @Autowired private SqlSessionFactory sqlSessionFactory; // 线程1:在事务中循环查询 public void thread1Transaction() { SqlSession sqlSession = sqlSessionFactory.openSession(TransactionIsolationLevel.READ_COMMITTED); try { for (int i = 0; i < 10; i++) { // 每次查询都会从一级缓存获取 User user = sqlSession.selectOne("com.example.mapper.UserMapper.selectById", 1L); System.out.println("Thread1 - 查询结果: " + user.getCount()); Thread.sleep(5000); // 等待5秒 } } finally { sqlSession.close(); } } // 线程2:更新数据 public void thread2Update() { SqlSession sqlSession = sqlSessionFactory.openSession(); try { sqlSession.update("com.example.mapper.UserMapper.incrementCount", 1L); sqlSession.commit(); // 提交事务 } finally { sqlSession.close(); } } }

4. 解决方案

如果你希望看到其他线程的更新,有以下几种方式:

4.1 关闭 MyBatis 一级缓存(针对特定查询)

<!-- 在mapper.xml中 --> <select id="selectById" resultType="User" flushCache="true"> SELECT * FROM user WHERE id = #{id} </select>

4.2 手动清除缓存

// 在查询前清除缓存 sqlSession.clearCache(); User user = sqlSession.selectOne("com.example.mapper.UserMapper.selectById", 1L);

4.3 使用不同的 SqlSession

// 每次查询创建新的 SqlSession for (int i = 0; i < 10; i++) { try (SqlSession newSession = sqlSessionFactory.openSession()) { User user = newSession.selectOne("com.example.mapper.UserMapper.selectById", 1L); System.out.println("查询结果: " + user.getCount()); } Thread.sleep(5000); }

4.4 配置二级缓存(不推荐用于此场景)

二级缓存是 Mapper 级别的,可以被多个 SqlSession 共享,但需要考虑同步问题。

5. 事务隔离级别的影响

即使 MyBatis 每次都去数据库查询,事务隔离级别也会影响你看到的数据:

// 设置事务隔离级别为 READ_COMMITTED @Transactional(isolation = Isolation.READ_COMMITTED) public void queryInTransaction() { for (int i = 0; i < 10; i++) { User user = userMapper.selectById(1L); System.out.println("查询结果: " + user.getCount()); Thread.sleep(5000); } }

事务隔离级别

  • REPEATABLE_READ(MySQL默认):同一事务中多次读取相同数据,结果一致

  • READ_COMMITTED:可以读取到其他事务已提交的修改

6. 推荐做法

如果需要在长事务中看到其他线程的更新:

  1. 使用 READ_COMMITTED 隔离级别

  2. 关闭 MyBatis 一级缓存​ 或每次查询前清空缓存

  3. 或者使用新的 SqlSession 查询

@Transactional(isolation = Isolation.READ_COMMITTED) public void queryWithLatestData() { for (int i = 0; i < 10; i++) { // 方案1:清空缓存 clearCacheAndQuery(); // 方案2:新建SqlSession查询 queryWithNewSession(); Thread.sleep(5000); } }

核心要点:MyBatis 一级缓存只在当前 SqlSession 内有效,其他线程的操作不会使其失效。如果需要看到最新数据,需要主动绕过缓存机制。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 2:17:06

字符设备驱动(5)

一 、简介字符设备与杂项设备的区别&#xff1a; &#xff08;1&#xff09;杂项设备的主设备号是固定为10&#xff0c;学习字符类设备就需要自己或者系统来分配 &#xff08;2&#xff09;杂项设备可以自动生成设备节点&#xff0c;字符设备需要自己生成设备节点二、申请设备号…

作者头像 李华
网站建设 2026/7/20 15:12:11

Flutter 表单开发实战:表单验证、输入格式化与提交处理

Flutter 表单开发实战&#xff1a;表单验证、输入格式化与提交处理 在 Flutter 应用开发中&#xff0c;表单是承接用户输入的核心组件&#xff0c;广泛应用于登录注册、信息提交、数据编辑等场景。一个高质量的表单不仅需要美观的布局&#xff0c;更要具备严谨的验证逻辑、友好…

作者头像 李华
网站建设 2026/7/19 22:13:17

【光子 AI】AI Agent 架构师 / 技术专家 10 道必考面试题和必过答案完整讲解 1

【光子 AI】AI Agent 架构师 / 技术专家 10 道必考面试题和必过答案完整讲解 文章目录 【光子 AI】AI Agent 架构师 / 技术专家 10 道必考面试题和必过答案完整讲解 一、请你整体设计一个企业级 AI Agent 平台的核心架构,并说明关键技术选型 【考察重点】 【必过答案要点】 【…

作者头像 李华
网站建设 2026/7/21 12:00:37

Flutter 主题与深色模式:全局样式统一与动态切换

Flutter 主题与深色模式&#xff1a;全局样式统一与动态切换 一、引言 在 Flutter 应用开发中&#xff0c;主题&#xff08;Theme&#xff09;是实现 UI 风格统一的核心机制&#xff0c;而深色模式&#xff08;Dark Mode&#xff09;作为当前主流的交互需求&#xff0c;能有效…

作者头像 李华
网站建设 2026/7/19 10:30:50

基于 GEE 使用 Sentinel-2 遥感影像数据反演水体叶绿素 a 质量浓度

目录 一、前言 二、初始化设置 三、影像预处理 四、影像集合加载与预处理 五、波段比计算与叶绿素浓度反演 六、统计分析与结果输出 七、结果可视化 八、核心逻辑与应用场景 九、注意事项 十、运行结果 若觉得代码对您的研究 / 项目有帮助&#xff0c;欢迎点击打赏支…

作者头像 李华
网站建设 2026/7/21 15:18:50

小红书数据采集架构解析与工程实践

小红书数据采集架构解析与工程实践 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 在内容营销和数据分析需求日益增长的背景下&#xff0c;小红书平台已成为品牌洞察和用户研…

作者头像 李华