AWS Lambda写入RDS MySQL后读取无法实时获取新数据问题
问题根源
Lambda的执行环境会被复用(保留几分钟到十几分钟),你在handler函数外初始化的数据库连接会被多个请求共享。结合MySQL默认的REPEATABLE READ隔离级别,同一个连接内的查询会一直读取事务启动时的数据快照,看不到其他连接(比如create_user或Workbench)提交的新数据,直到这个复用的连接被销毁(大概10分钟左右),才会创建新连接读取最新数据。
解决方案
把数据库连接移到handler内部管理
放弃连接复用,每次请求时创建新连接,请求结束后关闭。虽然会增加一点连接开销,但能彻底解决数据延迟问题,保证每次查询都用全新连接读取最新数据。示例代码:import pymysql def lambda_handler(event, context): # 每次请求创建新连接 conn = pymysql.connect( host='你的RDS地址', user='数据库用户名', password='数据库密码', db='目标数据库' ) try: with conn.cursor() as cursor: cursor.execute("SELECT * FROM users") result = cursor.fetchall() return {"users": result} finally: # 请求结束必关连接 conn.close()复用连接但重置事务状态
如果想保留连接复用的性能优势,每次查询前必须清理连接的残留事务状态,确保读取最新数据:import pymysql # 全局初始化连接(用于复用) conn = pymysql.connect( host='你的RDS地址', user='数据库用户名', password='数据库密码', db='目标数据库' ) def lambda_handler(event, context): global conn try: # 先检查连接是否存活,断开则自动重连 conn.ping(reconnect=True) # 提交所有未完成的事务,清除快照状态 conn.commit() # 或者临时修改本次会话的隔离级别为READ COMMITTED with conn.cursor() as cursor: cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED") cursor.execute("SELECT * FROM users") result = cursor.fetchall() return {"users": result} except Exception as e: # 连接异常时重新创建连接 conn = pymysql.connect( host='你的RDS地址', user='数据库用户名', password='数据库密码', db='目标数据库' ) raise e修改MySQL全局隔离级别
如果业务场景允许,把RDS MySQL的全局事务隔离级别改成READ COMMITTED。这样所有连接的每次查询都会读取最新的已提交数据,从根源避免快照读的问题。注意这是全局设置,要确认不会影响其他业务逻辑。
内容的提问来源于stack exchange,提问作者jerney
相关产品推荐
相关产品推荐

