MySQL查询结果不一致最常见原因是事务未提交或隔离级别导致快照不同,REPEATABLE-READ下存在幻读,READ-COMMITTED每次SELECT可能看到新提交数据,长事务和主从延迟也会加剧该现象。MySQL 查询结果不一致,先查当前会话的隔离级别结果不一致最常见原因是事务没提交、其他事务在改数据,而你的会话看到的是不同快照------这直接由 transaction_isolation 决定。别猜,直接查:SELECT @@transaction_isolation;注意:MySQL 8.0+ 返回类似 REPEATABLE-READ,5.7 可能是 REPEATABLE-READ 或带 SESSION 前缀的完整值;如果返回 READ-COMMITTED,那每次 SELECT 都可能看到新提交的数据,自然"不一致"。全局设置不影响已开启的事务,只对后续新会话生效SET SESSION transaction_isolation = 'READ-COMMITTED'; 立即生效,但仅限当前连接应用用连接池时,可能复用旧连接,导致隔离级别和你预期不符幻读不是 bug,是 REPEATABLE-READ 下的正常现象你在同一个事务里两次 SELECT,第二次多出几行(或少几行),但没改过这些行------这就是幻读。MySQL 默认的 REPEATABLE-READ 能防止不可重复读,但**不阻止幻读**(除非加 SELECT ... FOR UPDATE 或用间隙锁)。普通 SELECT 不加锁,InnoDB 用 MVCC 快照,但快照只覆盖"已有行",不锁定"未来插入的位置"想彻底避免幻读,得显式加锁:SELECT * FROM t WHERE id > 100 FOR UPDATE;,但这会阻塞其他插入INSERT ... SELECT 或 UPDATE ... WHERE 在 REPEATABLE-READ 下也会受幻读影响,因为内部执行时可能读到新插入的行检查是否被长事务拖累一个没提交的事务卡了 10 分钟,它持有的快照会让所有后续 SELECT 都看不到这期间的变更,看起来像"结果卡住不动"。查活跃事务:SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id FROM information_schema.INNODB_TRX;重点关注 trx_state = 'RUNNING' 且 trx_started 时间很早的记录。 文心快码 文心快码(Comate)是百度推出的一款AI辅助编程工具
相关推荐
程序员小八7773 小时前
MySQL 事务:一文把 ACID、隔离级别、MVCC、锁全串起来lzhdim3 小时前
提高 SQL 语句执行速度的方法小陈的进阶之路3 小时前
Claude Code辅助测试:导入篇skillsltl3 小时前
ClickHouse Distributed 引擎与分布式查询路由Wang's Blog3 小时前
PostgreSQL笔记60: 权限与角色管理——从层级体系到最佳实践whcyhhh4 小时前
头歌实践教学平台:大数据存储2023(六)for_ever_love__5 小时前
python基础语法学习: 闭包ly76895 小时前
Python 全面入门:从核心语法到工程实践Elastic 中国社区官方博客6 小时前
让大模型思考,让小模型执行:在 Elastic Workflows 中拆分 LLM 成本Faith_xzc6 小时前
一条 SQL 顶一条 Flink 链路?Doris Streaming Job 持续导入全景解析