長いトランザクションがあります
その真ん中と後ろの部分に行レベルのロックがあります
テストしたところ、ロックされていないことがわかりました
しかし、この部分だけを取り出すとロックできます
で私の長いトランザクション全体は、どのような状況でロックに影響しますか?
更新対象の product_term から ID を選択します (Id=".$v['P_Term_id'])。"
その真ん中と後ろの部分に行レベルのロックがあります
テストしたところ、ロックされていないことがわかりました
しかし、この部分だけを取り出すとロックできます
で私の長いトランザクション全体は、どのような状況でロックに影響しますか?
更新対象の product_term から ID を選択します (Id=".$v['P_Term_id'])。"
実は。 。まず初心者の質問をさせてください。 。 。 Innodbですか?以前、ミサムの事情に関する質問に遭遇しました。 。
わかりました。話題に戻ります。
排他ロックは通常、トランザクションが終了するまでこのクエリ範囲をロックします。
あなたと同じように。 ID行に対応するレコードがロックされます。
ただし、トランザクションの分離モードに基づきます。設定を変更していない場合、デフォルトは RR です。つまり、この排他ロックの前に実行した SELECT の結果は同じになります。 。これにより、ロックされていないように錯覚します。 。
あなたの事情がこんな感じなら
このように、デフォルトの RR レベルにより、最初の範囲検索には既に id=1 が含まれており、同じトランザクションで取得された 3 行目は最初の行と同じになります。実際、この行のデータは 2 行目で変更されています。 2 つの同時実行がある場合、テーブルがロックされていないように見えることがあります~~
トランザクションの開始時にロックすることのみを推奨します。この問題が発生しているかどうかわかりませんか?もしそうなら、トランザクション分離モードを注意深く研究すると、さらに落とし穴があることがわかるでしょう