3


1

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

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

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

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

    http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html[理解する]から、最初の選択は書き込みロックのみを実行し、2番目の選択は読み取りと書き込みロックを実行します。

どちらも使用可能に思えますが、最初のケースでは、User2はどのような値を読み取るのでしょうか。 User1が更新される前の初期値、それともUser1が更新された後の値(これは私が欲しいものです)?

だから私は混乱しています、私はSELECTを使用する必要があります…​ FOR UPDATEまたはSELECT …​ 共有モードでロックしますか?

1 Answer


6


おそらくFOR UPDATEを使いたいでしょう。

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

MySQLのドキュメントから:

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

したがって、LOCK IN SHARE MODEで更新が妨げられても、操作が読み取り値に依存している場合は、矛盾した状態になる可能性があります。