問題
表題の通りだが、Lambda x MySQL(RDS)でレコードを変更しても、Lambda上でDBに対するSELECT結果が変わらないという問題が起きた。その場しのぎとしてLambdaのコードを変更するとデータ変更が反映されるため、その方法で運用をしている環境だった(または、少し時間を空けて再クエリーしていた)。問題の解消法がわかったので載せておく。ただし原因はよくわかっていない。
解消方法
StackOverflowで同様の現象で困っている人がいて、回答の通り、Connection確立時に autocommit=True とすることで問題を解消できた。または各SELECT後にcommitしても解消できるかと思う。
stackoverflow: why is an aws lambda python call to a mysql rds being cached
以下はpymysqlというライブラリの例
# Connect to the database
connection = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor,
autocommit=True) # これを追加
疑問
問題を回避できたのは良いが、今回の問題がLambda起因なのかMySQL起因なのかすらよくわかっていない。
pymysqlのgithub issuesでは以下のように書いてあった。
Autocommit off can mean you are seeing a shadowed copy of the data in which case you will not see outside changes until you rollback/commit the transaction
オートコミットがオフであることが意味することは、データのシャドウドコピーを見ることであり、その状況では、コミット/ロールバックしない限り外部の変更を見ることができないだろう、と。
どなたか、何が起きているのか教えてください