面试你应该知道的 MySQL 锁( 二 )

  • Next-Key Locks,NK 是一种记录锁和间隙锁的组合锁 。是 3 和 4 的组合形式,既锁住行也锁住间隙 。并且采用的左开右闭的原则 。InnoDB 对于查询都是采用这种锁的 。
  • 举个例子
    CREATE TABLE `a` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`uid` int(10) unsigned DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_uid` (`uid`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;INSERT INTO `a`(uid) VALUES (1);INSERT INTO `a`(uid) VALUES (2);INSERT INTO `a`(uid) VALUES (3);INSERT INTO `a`(uid) VALUES (6);INSERT INTO `a`(uid) VALUES (10);# T1START TRANSACTION WITH CONSISTENT SNAPSHOT; //1SELECT * FROM a WHERE uid = 6 for UPDATE; //2COMMIT;//5# T2START TRANSACTION WITH CONSISTENT SNAPSHOT;//3INSERT INto a(uid) VALUES(11);INSERT INto a(uid) VALUES(5);//4INSERT INto a(uid) VALUES(7);INSERT INto a(uid) VALUES(8);INSERT INto a(uid) VALUES(9);SELECT * FROM a WHERE uid = 6 for UPDATE;COMMIT;ROLLBACK;按照上面 1,2,3,4 的顺序执行会发现第 4 步被阻塞了,必须执行完第 5 步后才能插入成功 。这里我们会很奇怪明明锁住的是uid=6 的这一行,为什么不能插入 5 呢?原因就是这里采用了 next-key 的算法,锁住的是(3,10)整个区间 。感兴趣的可以试一下 。
    小结今天给大家分享了一下 MySQL 的 InnoDB 的事务以及锁的一些知识,通过自己的实际上手实践对这块更加熟悉了,希望大家在看的时候也可以动手试试,这样更能体会,理解的更深刻 。




    推荐阅读