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