You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何AWS Lambda插入AWS RDS数据后,后续pymysql查询无法立即找到新行?

核心原因1:可重复读隔离级别+Lambda数据库连接复用

MySQL默认事务隔离级别为可重复读(REPEATABLE READ),而pymysql默认关闭自动提交(autocommit=False),所有查询会自动隐式开启事务。
Lambda运行时会复用之前冷启动的容器实例,如果你的第二个Lambda的数据库连接是全局初始化的(容器启动时创建一次,后续请求复用同一个连接),那么这个连接里可能还保留着第一个Lambda插入数据之前就开启的旧事务。根据可重复读的规则,旧事务中的所有查询只能看到事务开启前已经提交的数据,因此看不到第一个Lambda刚提交的新插入行。
你代码中get_things方法最后执行了db_conn.conn.commit(),这个操作会结束当前的旧事务。第一次查询虽然没拿到数据,但已经把旧事务关闭了,第二次查询会开启新事务,自然就能看到最新提交的数据——你调试时的5秒等待其实没有实际作用,把sleep去掉直接连续调用两次get_things也能拿到结果。

核心原因2:读写分离+主从复制延迟

如果你的第二个Lambda连接的是RDS只读副本,主库写入后的数据需要同步到只读副本,AWS RDS的主从复制通常有毫秒到秒级的延迟,刚好符合你等待5秒后才能查到的现象。


解决方案

  • 初始化pymysql连接时配置autocommit=True,每次查询执行完成后会自动提交事务,下一次查询自动开启新事务,不会出现旧事务看不到新数据的问题
  • 如果使用连接池/全局复用连接,每次查询前主动执行一次COMMIT或者ROLLBACK关闭上一个残留的事务,保证每次查询都在新事务中执行
  • 如果确实使用了只读副本做查询,并且要求读写强一致,可以让第二个Lambda直接连接主库,或者开启RDS同步复制功能降低延迟
  • 不需要在查询逻辑末尾加无意义的commit操作,如果你没有在查询方法里写入数据,开启autocommit后可以直接删掉这行冗余代码

内容的提问来源于stack exchange,提问作者sjg1729

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 19:30:01