为何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
相关产品推荐
相关产品推荐

