2012年12月25日 星期二

MySQL鎖表(Lock Table)Table-level與Row-level比較

定義

鎖表(Lock Table)

在要更新資料表的資料時,MySQL會將表資料鎖定無法讀取,直到資料異動完畢,MyISAM預設支援Table-level lock,而InnoDB預設支援Row-level lock

Table-level lock

資料表資料異動時,將「整個資料表(Table)」都鎖定住無法讀取

Row-level lock

資料表資料異動時,將「要更新的資料列(row)」都鎖定住無法讀取


注意事項

在使用Row-level lock時必需要明確指定要異動資料的主鍵(Primary Key),否則將會改用Table-level lock去做資料表的異動

範例

假設有user資料表,裡面有id與name的欄位,id是主鍵

SQL Table lock Row lock No lock 備註
SELECT *
FROM user
WHERE id='1'
FOR UPDATE;

v

明確指定主鍵,並且有此筆資料,row lock
SELECT *
FROM user
WHERE id='-1'
FOR UPDATE;

v
明確指定主鍵,若查無此筆資料,無 lock
SELECT *
FROM user
WHERE name='KeJyun'
FOR UPDATE;
v


無主鍵,table lock
SELECT *
FROM user
WHERE id<>'1'
FOR UPDATE;
v


主鍵不明確,table lock
SELECT *
FROM user
WHERE id LIKE '3'
FOR UPDATE;
v


主鍵不明確,table lock

備註

FOR UPDATE 僅適用於 InnoDB,且必須在交易區塊(BEGIN/COMMIT)中才能生效。

參考資料

沒有留言:

張貼留言

ADS