は`UPDATE SET WHERE`は並行処理の問題がありますか?
UPDATE SET is_locked = 1 WHERE id = 1 and is_locked = 0;
以下の文は、それが同時更新の下で整合性の問題を持っています考えてみましょうか?どうして?
(REPEATABLE-READのトランザクション分離レベルでのMySQL 5.7、)
は`UPDATE SET WHERE`は並行処理の問題がありますか?
UPDATE SET is_locked = 1 WHERE id = 1 and is_locked = 0;
以下の文は、それが同時更新の下で整合性の問題を持っています考えてみましょうか?どうして?
(REPEATABLE-READのトランザクション分離レベルでのMySQL 5.7、)
いいえ、更新が必要となるためには、記録上の排他ロックは更新されていないとInnoDBが上の1以上の排他ロックを許可しません。一度に記録する。多くの(すべてではない)状況で
(いくつかのコメントに対処するために)
、これはフォローするパターンです:
BEGIN;
SELECT ... FOR UPDATE;
use the data from the SELECT to make decisions, then
UPDATE the row(s) selected
COMMIT.
あなたがFOR UPDATE
をオフのままにした場合、その後、いくつかの他の接続がこっそり可能性があなたのUPDATE
がそれらの変更を壊すように行を変更してください。 (もちろん、これは "OK" である場合がある。)
UPDATE tbl SET is_locked = 1 WHERE id = 1 and is_locked = 0;
については
は問題はありません。そのステートメントは、実行方法にかかわらず、「アトミック」です。他の接続はあなたの中に潜入し、あなたを混乱させることはありません。 (それは問題ではありませんので、しかし、それは、論理的に冪等である。)
"にかかわらず" と、私はautocommit
、BEGIN
、tx_isolation_mode
など
に感謝を参照してください。問題は、リファレンスマニュアルを含むいくつかの場所で排他ロックが必要であることを読んだことですが、ほとんどはFOR UPDATEを使用するためです。このコンテキストの下でUPDATEとFOR UPDATEの間に違いがあるかどうかはわかりません。 –
selectにはupdate句が使用されます。次の時間には、あなたの質問にこれらの点が含まれています。 – Shadow
他に違いはありませんか? –