關於mysql事務行鎖for update實現寫鎖的功能

來源:互聯網
上載者:User

標籤:指定   實現   都對   use   post   where   set   共用   owa   

 

 例子1:

在電子商務裡,經常會出現庫存數量少,購買的人又特別多,大並發情況下如何確保商品數量不會被多次購買.

    其實很簡單,利用事務+for update就可以解決. (for update僅僅適用於InnoDB)

我們都知道for update實際上是共用鎖定,是可以被讀取的.但是如何在執行時,不被讀取呢.

簡單來說:假設現在庫存為1,現在有A和B同時購買

   先開啟一個事務

begin;

select stock from good where id=1 for update;//查詢good表某個商品中stock的數量

  查出來後,在程式裡在判斷這個stock是否為0(你用什麼語言,不關我事)

最後在執行

update good set stock=stock-1 where id=1

最後在

commit

    但是這個時候B也是select stock from good where id=1 for update;注意:for update不能省略..這個時候會出現被鎖住,無法被讀取.

所以這就能夠保證了商品剩餘數量為1的一致性.

 

例子2:

 由於InnoDB預設是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL才會執行Row lock (只鎖住被選取的資料例) ,否則MySQL將會執行Table Lock (將整個資料表單給鎖住)。
舉個例子:
假設有個表單products ,裡面有id跟name二個欄位,id是主鍵。
例1: (明確指定主鍵,並且有此筆資料,row lock)
SELECT * FROM products WHERE id=‘3‘ FOR UPDATE;
SELECT * FROM products WHERE id=‘3‘ and type=1 FOR UPDATE;

例2: (明確指定主鍵,若查無此筆資料,無lock)
SELECT * FROM products WHERE id=‘-1‘ FOR UPDATE;

例2: (無主鍵,table lock)
SELECT * FROM products WHERE name=‘Mouse‘ FOR UPDATE;

例3: (主鍵不明確,table lock)
SELECT * FROM products WHERE id<>‘3‘ FOR UPDATE;

例4: (主鍵不明確,table lock)
SELECT * FROM products WHERE id LIKE ‘3‘ FOR UPDATE;

注1: FOR UPDATE僅適用於InnoDB,且必須在交易區塊(BEGIN/COMMIT)中才會生效。
注2: 要測試鎖定的狀況,可以利用MySQL的Command Mode ,開二個視窗來做測試。

在MySql 5.0中測試確實是這樣的
另外:MyAsim 只支援表級鎖,InnerDB支援行級鎖
添加了(行級鎖/表級鎖)鎖的資料不能被其它事務再鎖定,也不被其它事務修改(修改、刪除)
是表級鎖時,不管是否查詢到記錄,都會鎖定表

此外,如果A與B都對錶id進行查詢但查詢不到記錄,則A與B在查詢上不會進行row鎖,但A與B都會擷取排它鎖,此時A再插入一條記錄的話則會因為B已經有鎖而處於等待中,此時B再插入一條同樣的資料則會拋出Deadlock found when trying to get lock; try restarting transaction然後釋放鎖,此時A就獲得了鎖而插入成功


上面介紹過SELECT ... FOR UPDATE 的用法,不過鎖定(Lock)的資料是判別就得要注意一下了。由於InnoDB 預設是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL 才會執行Row lock (只鎖住被選取的資料) ,否則mysql 將會執行Table Lock (將整個資料表單給鎖住)。


注意:之前orcale中使用過nowait關鍵字,以為在mySQL中也可以,但是結果卻不是這樣的。原因是:目前builtin版本的innodb不支援nowait句法的

關於mysql事務行鎖for update實現寫鎖的功能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.