Help us understand the problem. What is going on with this article?

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

問題

表題の通りだが、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起因なのかすらよくわかっていない。
クエリ後にConnectionが切れているのは確認したが、コネクション再開時に依然としてトランザクションが続いているということはありえるのだろうか。

もしそうだとすると、Select後にCommitすることで、他のトランザクションの変更を見るようになるということであれば理解できる。
(MySQL(innoDB)のデフォルトの分離性レベルは「REPEATABLE-READ」で、innoDBであればこの分離性レベルであってもファントムリードも起きないほど分離性レベルは高く、他トランザクションの変更を見ていないのではないか?)

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:

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした