程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql InnoDB行鎖的一點體會

mysql InnoDB行鎖的一點體會

編輯:MySQL綜合教程


mysql InnoDB行鎖的一點體會   表結構如下  Sql代碼   CREATE TABLE `20121015_t` (     `id` int(11) NOT NULL AUTO_INCREMENT,     `a` int(11) NOT NULL,     `b` int(11) NOT NULL,     PRIMARY KEY (`id`),     KEY `20121015_t_a` (`a`)   ) ENGINE=InnoDB     www.2cto.com   現在只在列a上有索引  在兩個客戶端分別執行  Sql代碼   update 20121015_t set b=4 where a=1 and b=3;     Sql代碼   update 20121015_t set b=2 where a=1 and b=1;     www.2cto.com   第二個會等待超時  [Err] 1205 - Lock wait timeout exceeded; try restarting transaction    原來InnoDB不是只在最終要更新的行上加鎖,而是在被掃描過的所有行上加鎖.也就是說,  如果執行update 20121015_t set b=2 where b=1;其實表裡所有的行都被加鎖了. 
  他們官方文檔說明如下  A locking read, an UPDATE, or a DELETE generally set record locks on every index record that is scanned in the processing of the SQL statement. It does not matter whether there are WHERE conditions in the statement that would exclude the row. InnoDB does not remember the exact WHERE condition, but only knows which index ranges were scanned.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved