mysql执行SQL查询时结果不一致_检查事务隔离级别设置与幻读

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辅助编程工具

相关推荐
向日的葵00617 分钟前
langchain的Tools教程(三)
python·langchain·tools
其实防守也摸鱼1 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚1 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
龙仔7251 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
言乐62 小时前
Python实现可运行解密游戏游戏框架
python·游戏·小程序·游戏程序·关卡设计
霁月的小屋2 小时前
生产环境中的事务实践——银行系统上线记(四)
数据库
YUS云生2 小时前
Python学习笔记·第31天:FastAPI入门——路由、路径参数、查询参数与请求体
笔记·python·学习
Database_Cool_2 小时前
AI 应用数据底座首选:阿里云 PolarDB 为大模型 RAG 提供一体化支撑
数据库·阿里云
玖玥拾2 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
智写-AI2 小时前
真实有效的免费降英文AI工具服务商
人工智能·python