Neo's Blog

首頁 相本 討論 書籤

分類目錄
本站日誌 (51)
碎碎唸啦 (173)
網站架設 (84)
程式設計 (161)
軟體使用 (69)
電子商務 (126)
經營奇想 (48)
基金理財 (11)
聰明消費 (87)
電影心得 (47)
開放原碼 (16)
工作記錄 (2)
毛毛小記 (9)
就是不同 (2)




歷史資料
 




April 22, 2006
[MySQL] SELECT ... FOR UPDATE 的 Row Lock 與 Table Lock

先前介紹過 SELECT ... FOR UPDATE 的用法,不過鎖定(Lock)的資料是判別就得要注意一下了。由於 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;

例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 ,開二個視窗來做測試。

 
由 Neo 發表於 April 22, 2006 10:44 AM 收進你的MyShare個人書籤  

很好,谢谢俄,以后我会经常来这,学习学习,你的思路非常清晰,很有条理,让人易懂!
不像有些傻货,故意说得你云里雾里的,让你觉得很玄!
多谢啦。。。
我会推荐朋友多来你这学习


edward 發表於 May 29, 2007 02:58 PM

上面那個說的好呀~ 講的清楚又易懂才好嘛...一堆人都是講的超複雜....看完更不懂!! 這位大大就真的把東西寫的一目瞭然, 一看就懂!讚


no14551 發表於 August 23, 2007 03:10 PM

強~~又來偷學東西了


弱雞 發表於 March 5, 2008 04:25 PM
發表迴響  
(*星號開頭為必填欄位)











(請輸入您看到的數字,看不到請按右鍵->顯示圖片)


記住我的資訊?







Copyright 2005 Neo's Blog All rights reserved.