Python MySQL中SELECT是否需commit()?为何读取不到最新数据?
问题分析与解决方案
核心原因:MySQL事务隔离机制+Lambda连接复用
你的问题是MySQL InnoDB默认事务隔离级别(REPEATABLE READ) 与AWS Lambda的连接复用特性共同作用的结果:
REPEATABLE READ的快照读特性
InnoDB默认隔离级别下,一个事务启动后,所有查询都会基于事务启动时的数据快照返回结果,哪怕其他事务已经提交了数据修改。如果你的数据库连接没有显式结束事务(提交/回滚),后续查询会一直复用这个旧快照,自然读不到新数据。Lambda的连接复用行为
Lambda函数执行结束后,运行环境可能被保留(热启动),数据库连接conn会被复用给后续调用。如果上一次调用的事务未关闭,后续复用该连接的查询会继承旧事务上下文,持续读取快照数据。
为什么conn.commit()能解决问题
调用conn.commit()会立即结束当前事务,清除旧的事务上下文,让后续查询在新事务中执行,此时就能读取到其他事务已提交的最新数据。
可选优化方案
除了在查询后添加commit(),还有两种更规范的处理方式:
- 开启自动提交
在获取连接后设置自动提交,让每个查询都作为独立事务执行:conn.autocommit(True) - 修改事务隔离级别
将连接的隔离级别改为READ COMMITTED,这样每次查询都会读取最新的已提交数据:conn.set_session(transaction_isolation='READ-COMMITTED')
验证建议
可以执行以下SQL确认数据库的隔离级别:
SELECT @@transaction_isolation;
默认结果应为REPEATABLE-READ,这也验证了上述分析的合理性。
你提到的大量并行插入操作虽未直接操作version表,但会增加事务负载,可能延长旧快照的保留时间,但核心问题仍是未关闭的事务上下文被复用。
内容的提问来源于stack exchange,提问作者user2913139
相关产品推荐
相关产品推荐

