考慮下面`UPDATE SET WHERE`是否存在併發問題?
UPDATE SET is_locked = 1 WHERE id = 1 and is_locked = 0;
的聲明是否有下併發更新一致性問題?爲什麼?
(MySQL的5.7,可重複讀的事務隔離級別)
考慮下面`UPDATE SET WHERE`是否存在併發問題?
UPDATE SET is_locked = 1 WHERE id = 1 and is_locked = 0;
的聲明是否有下併發更新一致性問題?爲什麼?
(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是否有區別。 –
更新子句與選擇一起使用。下次請在您的問題中包括這些要點,而不是單獨的後續評論。 – Shadow
沒有其他區別嗎? –