MyISAMテーブルではなくInnoDBテーブルを使用していると思います。 InnoDB トランザクションモデル で説明されているように 、すべて クエリ(SELECTを含む)はトランザクション内で実行されます。
AutoCommit
の場合 オンの場合、トランザクションはクエリごとに開始され、成功した場合は暗黙的にコミットされます(失敗した場合、動作は異なる場合がありますが、トランザクションは終了することが保証されています)。 MySQLのbinlogで暗黙のコミットを確認できます。 AutoCommit
を設定する falseにすると、トランザクションを自分で管理する必要があります。
デフォルトのトランザクション分離レベルは、 REPEATABLEREAD<です。 / a> 、つまり、すべてのSELECT
クエリは同じスナップショット(トランザクションの開始時に確立されたスナップショット)を読み取ります。
他の回答で与えられた解決策に加えて(ROLLBACK
読み始める前に)ここにいくつかの解決策があります:
など、別のトランザクション分離レベルを選択できます。コミット済みを読む
、これによりSELECT
クエリは毎回新しいスナップショットを読み取ります。
AutoCommit
を残すこともできます true(デフォルト設定)に設定し、BEGIN WORK
を発行して独自のトランザクションを開始します 。これにより、AutoCommit
が一時的に無効になります COMMIT
を発行するまでの動作 またはROLLBACK
その後、各クエリは独自のトランザクションを再度取得します(または、BEGIN WORK
で別のクエリを開始します 。
個人的には、よりエレガントに見えるので、後者の方法を選択します。