InnoDBはデフォルトで行レベルのロックなので、主キーが「明示的に」指定されている場合、MySQLは行ロックのみを実行します(選択したデータのみをロックします)。それ以外の場合、MySQLはテーブルロックを実行します(データフォーム全体をロックします)。 )。
例:
idとnameの2つのフィールドを持つフォーム製品があり、idが主キーであるとします。
例1:(主キーを明示的に指定し、このデータ、行ロックを持つ)
SELECT * FROM WHERE WHERE id = '3' FOR UPDATE;
例2:(そのようなデータがない場合、ロックがない場合は、主キーを明示的に指定します)
SELECT * FROM products WHERE id = '-1' FOR UPDATE;
例2:(主キーなし、テーブルロック)
SELECT * FROM products WHERE name = 'Mouse' FOR UPDATE;
例3:(主キーが明確でない、テーブルロック)
SELECT * FROM WHERE WHERE id <> '3' FOR UPDATE;
例4:(主キーが明確でない、テーブルロック)
SELECT * FROM WHERE id LIKE '3' for UPDATE;
楽観的および悲観的ロック戦略
悲観的ロック:データの読み取り時に数行をロックします。これらの行に対する他の更新は、悲観的ロックの終了が続行できるまで待機する必要があります。
オプティミスティック:データを読み取るときにロックされていません。更新時に、データが更新されているかどうかを確認してください。更新されている場合は、現在の更新をキャンセルしてください。通常、悲観的ロックの待機時間が長すぎて受け入れられない場合は、楽観的ロックを選択します。