測試表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `u_name_uq` (`username`) USING BTREE
) ENGINE=InnoDB;
INSERT INTO `mh_1112`.`user`(`id`, `username`, `password`) VALUES (1, 'zhangsan', '123456');
INSERT INTO `mh_1112`.`user`(`id`, `username`, `password`) VALUES (2, 'zhangsi', 'abc456');
INSERT INTO `mh_1112`.`user`(`id`, `username`, `password`) VALUES (3, 'lisan', '123654');
測試1:用主鍵查詢時是行鎖:
窗口1查詢id=1時,窗口2查詢id=2時可以查詢,查詢id=1時會卡在那等待窗口1完成事務。
窗口1提交事務,窗口2就可以查出id=1的結果了
測試2:使用索引查詢時也是行鎖,鎖的是查到的行
當窗口1根據username索引查詢到id=1和2的結果時,窗口2查詢id=3時可以查詢,查詢id=1和2時會卡住,等待窗口1的事務完成。
當窗口1提交或回滾事務時,窗口2卡住的查詢就出現結果了。
測試3:當索引失效或者是不使用索引時:鎖的是表
索引失效
當使用like + %開頭的查詢時索引失效,窗口1查出id=1和3的數據,窗口2查詢id=2的數據會卡住,說明整個表都被鎖了。
窗口1完成事務,窗口2出現結果:
不使用索引
窗口1不適用任何索引查詢id=1的結果,窗口2查詢id=2的結果會卡住,說明還是表鎖