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

相关推荐
Aision_4 分钟前
从工具调用到 MCP、Skill完整学习记录
java·python·gpt·学习·langchain·prompt·agi
辞旧 lekkk4 小时前
【Qt】信号和槽
linux·开发语言·数据库·qt·学习·mysql·萌新
2301_809204705 小时前
JavaScript中严格模式use-strict对引擎解析的辅助.txt
jvm·数据库·python
zjy277776 小时前
mysql如何选择合适的索引类型_mysql索引设计实战
jvm·数据库·python
Aaswk6 小时前
Java Lambda 表达式与流处理
java·开发语言·python
笨蛋不要掉眼泪6 小时前
Mysql架构揭秘:update语句的执行流程
数据库·mysql·架构
万邦科技Lafite6 小时前
京东item_get接口实战案例:实时商品价格监控全流程解析
java·开发语言·数据库·python·开放api·淘宝开放平台
秋97 小时前
ruoyi项目更换为mysql9.7.0数据库
数据库
Andya_net7 小时前
MySQL | MySQL 8.0 权限管理实践-精确赋予库、表只读等权限
android·数据库·mysql
Cyber4K7 小时前
【Python专项】进阶语法-系统资源监控与数据采集(1)
开发语言·python·php