Python スクリプトでは、MySQL データベースに頻繁にクエリを実行して動的データを取得することが不可欠です。このようなデータを取得するためにループに依存すると、後続のフェッチが同じ結果を返すことがわかり、混乱する可能性があります。
指定された Python スクリプトでは、ループを使用して MySQL を繰り返し実行します。クエリを実行し、結果をリストに保存します:
<code class="python">for i in range(listSize): # ... # SQL query sql = "SELECT * FROM table" # ...</code>
ループが反復ごとにデータベースから取得したデータを更新すると期待されているにもかかわらず、スクリプトは同じ結果を繰り返し取得します。
問題の核心は、MySQL のトランザクション分離レベルにあります。デフォルトでは、MySQL で使用されるストレージ エンジンである InnoDB は READ COMMITTED 分離レベルで動作し、次のことが保証されます。
「同じトランザクション内の一貫した読み取りは、最初の読み取りによって確立されたスナップショットを読み取ります。」
これは、トランザクション内での後続のクエリでは、トランザクションの開始時に存在していたデータが取得されることを意味します。これに対処するには、ループの各反復を mydb.commit() コマンドで終了する必要があります。
<code class="python">import ... # ... while True: # ... # SQL query sql = "SELECT * FROM table" # ... mydb.commit()</code>
接続をコミットすることで、スクリプトはデータベースにトランザクション中に行われた変更を強制的にキャプチャし、その後の変更を確実にキャプチャします。クエリはデータベースの現在の状態を反映します。
MySQL 接続内の各ループ反復は別個のトランザクションとして扱われ、デフォルトでは一貫性のあるスナップショットから読み取ります。各反復の最後に接続をコミットすると、後続のトランザクションで最新のスナップショットが読み取られ、前のトランザクションで行われた変更が反映されます。
以上がPython で MySQL クエリを繰り返すと同じ結果が返されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。