sql >> データベース >  >> RDS >> Mysql

AutoCommitが0に設定されたDBIデータベースハンドルは、SELECTで適切なデータを返しませんか?

    MyISAMテーブルではなくInnoDBテーブルを使用していると思います。 InnoDB トランザクションモデル で説明されているように 、すべて クエリ(SELECTを含む)はトランザクション内で実行されます。

    AutoCommitの場合 オンの場合、トランザクションはクエリごとに開始され、成功した場合は暗黙的にコミットされます(失敗した場合、動作は異なる場合がありますが、トランザクションは終了することが保証されています)。 MySQLのbinlogで暗黙のコミットを確認できます。 AutoCommitを設定する falseにすると、トランザクションを自分で管理する必要があります。

    デフォルトのトランザクション分離レベルは、 REPEATABLEREAD<です。 / a> 、つまり、すべてのSELECT クエリは同じスナップショット(トランザクションの開始時に確立されたスナップショット)を読み取ります。

    他の回答で与えられた解決策に加えて(ROLLBACK 読み始める前に)ここにいくつかの解決策があります:

    など、別のトランザクション分離レベルを選択できます。コミット済みを読む 、これによりSELECT クエリは毎回新しいスナップショットを読み取ります。

    AutoCommitを残すこともできます true(デフォルト設定)に設定し、BEGIN WORKを発行して独自のトランザクションを開始します 。これにより、AutoCommitが一時的に無効になります COMMITを発行するまでの動作 またはROLLBACK その後、各クエリは独自のトランザクションを再度取得します(または、BEGIN WORKで別のクエリを開始します 。

    個人的には、よりエレガントに見えるので、後者の方法を選択します。



    1. AWSRDSでのMySQLデータベースおよびOracleデータベースでのJDeveloperの使用パート1

    2. 最も閲覧されている機能データベースの実装

    3. MySQL空間拡張を使用して、円内のポイントを選択します

    4. ホストxxxxはこのMySQLサーバーへの接続を許可されていません