web-dev-qa-db-ja.com

MySQL InnoDB: `FORUPDATE`と` LOCK IN SHAREMODE`の違い

2つのロッキング読み取り句の正確な違いは何ですか。

SELECT ... FOR UPDATE

そして

SELECT ... LOCK IN SHARE MODE 

そして、なぜあなたは一方を他方の上に使用する必要があるのでしょうか?

22
pje

私はこの2つの違いを理解しようとしてきました。次の人に役立つことを願って、見つけたものを文書化します。

LOCK IN SHARE MODEFOR UPDATEはどちらも、選択された行を他のトランザクションが更新できないようにします。 2つの違いは、データの読み取り中にロックを処理する方法にあります。

LOCK IN SHARE MODEは、別のトランザクションがロックされた同じ行を読み取ることを妨げません。

FOR UPDATEは、同じ行の他のロック読み取りを防止します(非ロック読み取りは引き続きその行を読み取ることができます。LOCK IN SHARE MODEおよびFOR UPDATEはロック読み取りです)。

これは、あるステートメントで値を読み取り、別のステートメントで値を更新するカウンターの更新などの場合に重要です。ここでLOCK IN SHARE MODEを使用すると、2つのトランザクションが同じ初期値を読み取ることができます。したがって、両方のトランザクションによってカウンターが1ずつ増加した場合、両方のトランザクションが最初に同じ値を読み取るため、終了カウントは1だけ増加する可能性があります。

FOR UPDATEを使用すると、最初のトランザクションが完了するまで、2番目のトランザクションが値を読み取らないようにロックされます。これにより、カウンターが2ずつ増加します。

43
Aishwar

更新の場合---選択した行を次のステップ(このトランザクションの終了前)で更新できることをMysqlに通知しているため、mysqlは同じ行セットの読み取りロックを他の行に付与しません。その瞬間のトランザクション。他のトランザクション(読み取り/書き込み)は、最初のトランザクションが終了するまで待機する必要があります。

共有の場合-読み取り目的でのみテーブルから行を選択し、トランザクションの終了前に変更しないことをMysqlに示します。任意の数のトランザクションが行の読み取りロックにアクセスできます。

注:このステートメント(更新用、共有用)が適切に使用されていない場合、デッドロックが発生する可能性があります。

6
charan teja