2017-10-18 123 views
0

我想鎖定MySQL(InnoDB)中的特定行,以便特定行不能被另一個連接讀取。獨佔鎖(行級) - MySql需要示例

start transaction; 
Select apples from fruit where apples = 'golden'; 
commit; 

現在我想申請一個獨佔鎖

獨佔鎖 一種鎖,以防止任何其他交易從鎖定同一行。

https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html#innodb-shared-exclusive-locks

我假設,鎖獲取的應用,然後試圖訪問同一行,必須等待,直到第一個連接第二連接釋放鎖與「提交」;

我的問題是,如何調整我的SQL語句以應用該鎖?或者這是否會在開始交易時自動發生?

我一直在試圖找到一個很好的例子,沒有。

回答

1
START TRANSACTION; 
Select apples 
    from fruit 
where apples = 'golden' 
    FOR UPDATE; 
... 
COMMIT; 

SELECT ... FOR UPDATE語句首先鎖定該行,然後返回給你。

任何其他人試圖在同一行同時做同樣的事情將等待您的COMMITROLLBACK,然後他們將收到行...與您所做的任何更改。

如果您無意更改該行,您只是想確保沒有其他人可以,那麼您可以SELECT ... LOCK IN SHARE MODE

請注意,無論哪種方式,它在技術上不是「行」,它實際上是被鎖定的索引記錄,但在InnoDB中,「一切都是索引」(甚至一張沒有索引的表格事實上仍然有一個由系統創建的索引),所以最終結果是一樣的。