MySQL クエリを繰り返しても最新のデータが返されない: トランザクション コミットによる問題の解決
Python では、急速に変化する MySQL データベースに繰り返しクエリを実行しながら、各クエリが最新のデータを確実に取得することが重要です。ただし、データベースが変更されているにもかかわらず、後続のクエリが同じデータを返すという問題が発生する場合があります。これは、データベース接続の基礎となる分離レベルによるものです。
分離レベルの概念は、トランザクションが互いにどのように分離されるかを決定します。 MySQL のデフォルトの分離レベルである REPEATABLE READ の場合、同じトランザクション内の各クエリは、トランザクションの開始時に取得されたデータベースのスナップショットに依存します。これは、後続のクエリには、トランザクションがアクティブな間に行われたデータベースの変更が反映されないことを意味します。
この問題を解決するには、各クエリの後に接続をコミットすることが不可欠です。これにより、新しいトランザクションが開始され、次のクエリが最新のデータベース スナップショットで動作するようになります。以下に例を示します。
<code class="python">while True: # SQL query sql = "SELECT * FROM table" # Read the database, store as a dictionary mycursor = mydb.cursor(dictionary=True) mycursor.execute(sql) # Store data in rows myresult = mycursor.fetchall() # Transfer data into list for row in myresult: myList[int(row["rowID"])] = (row["a"], row["b"], row["c"]) print(myList[int(row["rowID"])]) # Commit ! mydb.commit() print("---") sleep (0.1)</code>
各クエリの後にコミットすることで、接続は新しいトランザクションを確立し、後続の各クエリで最新のデータベース スナップショットが確実に読み取られるようになり、それによって最新のデータベースの変更が反映されます。これにより、クエリが繰り返されて常に古いデータが返されるという問題が解決されます。
以上がMySQL クエリを繰り返しても最新のデータが返されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。