現如今,面試高級測試、性能測試等崗位,面試官都喜歡問一些底層原理的問題,感覺和開發的面試越來越靠近了。
比如mysql,可能會問如下問題:
InnoDB行鎖實現方式? innodb如何解決幻讀? 什么是回表? B-樹的不足? B+樹如何解決了B-樹的不足? 哪些情況,創建了索引也用不上? 什么是聚集索引、索引覆蓋、索引下推? 輔助索引的葉子節點為什么不存儲數據的指針地址? InnoDB、MyISAM的優缺點? 事務的隔離級別有哪些?分別解決什么問題? MVCC的原理? 主從復制原理?
雖然實際工作不一定能用上,但這樣確實可以看出面試者對知識的掌握程度和研究深度;本文主要演示一下之前一位微友遇到的面試題(上面第一個問題);從mysql-5.5.5開始,InnoDB就作為默認的存儲引擎了,其相關的特性,可以參考官網:https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html
創建表
CREATE TABLE `employeeInfo` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `employeeId` varchar(10) DEFAULT NULL, `job` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_employeeId` (`employeeId`) ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
添加數據
插入數據
insert INTO employeeInfo(name,employeeId,job) VALUES('全棧測試筆記0001','qzcsbj0001','dev'); insert INTO employeeInfo(name,employeeId,job) VALUES('全棧測試筆記0002','qzcsbj0002','manager');
不使用索引
說明:
update/insert/delete默認加上排它鎖,下面為了演示,手動在事務中加
下面選中的語句即為當前執行的語句
session1對第一條數據加排它鎖,where后面字段是非索引字段
session2對第二條數據加排它鎖,阻塞
session2插入數據,阻塞
至此,說明session1鎖表了。
主鍵索引
session1對第一條數據加排它鎖,where后面字段是主鍵索引字段
session2對第一條數據加排它鎖,阻塞,因為是同一條數據
session2對第二條數據加排它鎖,成功
session2插入數據,成功
至此,說明session1是行鎖。
唯一索引
session1對第一條數據加排它鎖,where后面字段是唯一索引字段
session2對第一條數據加排它鎖,阻塞,因為是同一條數據
session2對第二條數據加排它鎖,成功
session2對第一條數據加排它鎖(where后面是主鍵索引字段),阻塞,因為是同一條數據
session2對第二條數據加排它鎖(where后面是主鍵索引字段),成功
session2插入數據,成功
至此,說明session1是行鎖。
結論:InnoDB的行鎖是通過索引實現的,如果session1不通過索引訪問數據,就會鎖表;另外,不同記錄的索引鍵最好不要一樣,否則會沖突導致鎖等待。
bak:https://www.cnblogs.com/uncleyong/p/13782477.html