ホームページ  >  に質問  >  本文

更新時に MySQL が読み込まれないようにする

単純なクエリが 2 つあり、1 つはテーブルの読み取り、もう 1 つはテーブルの更新です。更新クエリの実行中に選択クエリの読み取りをロックする方法。 MySQL InnoDB では、書き込み/更新はデフォルトでロックされていますが、読み取り/選択ではトランザクションの前に古いデータが取得されることに気付きました。

更新クエリでトランザクションを使用してから、トランザクションの外で SELECT ... FOR UPDATE を使用しようとしましたが、成功しなかったようです。また、テスト目的で、UPDATE クエリの速度を下げる方法を知りたいです。 SLEEP(X) を見つけましたが、更新クエリでそれを実装する方法がわかりません。

書き込みが完了するまで各クエリを読み取り/書き込み待機させる方法。

P粉190883225P粉190883225367日前601

全員に返信(1)返信します

  • P粉877114798

    P粉8771147982023-11-08 11:37:07

    READ-COMMITTED トランザクションを使用すると、最新のコミットされたトランザクションが表示されます。 SELECT ... LOCK IN SHARE MODE を使用すると、未処理の更新がコミットされるまで読み取りがブロックされます。

    ###これを試して。 1 つの画面でトランザクションと更新を開始します。 SLEEP() は必要ありません。トランザクションはコミットされないだけです。 UPDATE によって作成されたロックは、コミットするまで存在し続けます。

    リーリー

    まだ提出しないでください。

    その間、2 番目の画面でトランザクションの分離を読み取りコミット トランザクションに設定します。 InnoDB クエリは自動コミットされる場合でもトランザクションを使用するため、明示的なトランザクションを開始する必要はありません。

    リーリー

    更新によって作成された未処理の排他ロックがまだ存在するため、共有モードでのロックは待機します。

    最初の画面:

    リーリー

    2 番目の画面で、出来上がりです。ブロッキング読み取りのブロックが解除され、トランザクションをフラッシュせずに UDPATE の結果をすぐに確認できます。

    返事
    0
  • キャンセル返事