3

これが私の希望する取引注文です:

  1. User1 はフィールドを選択し、操作を実行し、新しい値で更新します。
  2. User2 はフィールドを選択し、操作を実行し、新しい値で更新します。
  3. User3 はフィールドを選択し、操作を実行し、新しい値で更新します。

が理解していることから、最初の選択は書き込みロックのみを実行し、2番目の選択は読み取りおよび書き込みロックを実行します。

どちらも使えるように見えますが、最初のケースでは、User2 はどのような値を読み取りますか? User1 が更新される前の初期値、または User1 が更新された後の値 (どちらが必要ですか)?

だから私は混乱しています.SELECT ... FOR UPDATEまたはSELECT ... LOCK IN SHARE MODEを使用する必要がありますか?

4

1 に答える 1

7

おそらく FOR UPDATE を使用する必要があります。

「LOCK IN SHARE MODE」を使用すると、2 番目のユーザーは値が更新される前に値を読み取ることができます。

MySQL ドキュメントから:

ページ ロックまたは行ロックを使用するストレージ エンジンで FOR UPDATE を使用する場合、クエリによって検査される行は、現在のトランザクションが終了するまで書き込みロックされます。LOCK IN SHARE MODE を使用すると、他のトランザクションが検査された行を読み取ることはできますが、それらを更新または削除することはできない共有ロックが設定されます。

そのため、LOCK IN SHARE MODE で更新ができなくても、読み取り値に依存して操作を行うと、矛盾した状態になる可能性があります。

于 2009-05-14T02:37:43.933 に答える