3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Lambda x MySQLでデータを更新してもクエリ結果が変わらない(キャッシュされているような振る舞いをする)

Last updated at Posted at 2019-12-03

問題

表題の通りだが、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というライブラリの例

query.py
# 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

オートコミットがオフであることが意味することは、データのシャドウドコピーを見ることであり、その状況では、コミット/ロールバックしない限り外部の変更を見ることができないだろう、と。

どなたか、何が起きているのか教えてください:bow:

参考

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?