定義
鎖表(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 |