首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL InnoDB 行鎖與表鎖:SELECT ... FOR UPDATE 實戰詳解

     編輯:MySQL 資料庫相關知識

SELECT ... FOR UPDATE 僅在 InnoDB 且事務中生效,鎖粒度取決於 WHERE 條件是否命中主鍵/唯一索引。

鎖行為對照表

SQL 示例條件特徵鎖類型說明
SELECT * FROM products WHERE id='3' FOR UPDATE;明確主鍵,記錄存在行鎖精確鎖定該行
SELECT * FROM products WHERE id='-1' FOR UPDATE;明確主鍵,記錄不存在無鎖不阻塞其他事務
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;非索引列/非唯一索引表鎖全表掃描,升級為表鎖
SELECT * FROM products WHERE id<>'3' FOR UPDATE;範圍/不等於主鍵表鎖無法使用索引定位
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;模糊匹配主鍵表鎖LIKE 導致索引失效

關鍵原則

  1. InnoDB 默認行級鎖,**僅當 WHERE 條件明確命中主鍵或唯一索引且記錄存在** 才加行鎖。
  2. 其他情況(全表掃描、範圍查詢、非索引列、索引失效)將退化為**表鎖**,嚴重降低併發度。
  3. FOR UPDATE 必須在 BEGIN/COMMIT 事務塊中,自動提交模式下鎖即釋放無效。

測試方法

開啟兩個 MySQL 客戶端會話:
會話 1:BEGIN; SELECT * FROM t WHERE id=1 FOR UPDATE; -- 不提交
會話 2:BEGIN; UPDATE t SET v=2 WHERE id=1; -- 觀察是否阻塞

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved