ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 鎖表 (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)中才能生效。 ### 參考資料 - [KeJyun學習日誌: MySQL鎖表(Lock Table)Table-level與Row-level比較](http://blog.kejyun.com/2012/12/Compare-Tabel-And-Row-Level-Lock-On-MySQL.html)