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 的事务以及锁的一些知识,通过自己的实际上手实践对这块更加熟悉了,希望大家在看的时候也可以动手试试,这样更能体会,理解的更深刻 。
推荐阅读
- 帮你精通Linux:Find命令高阶操作4项动作
- python 手把手教你基于搜索引擎实现文章查重
- 春季吃菠萝能促进消化缓解疲劳 这些你不知道的好处
- 春季女人如何排毒瘦身
- 春季容易上火 对抗上火你应该这么吃
- 招财鱼养护应该注意哪些问题
- 护肤|女生应不应该学会化妆
- 第一次去新疆旅游应该参观那些景点
- 17K star 仓库,解决 90% 的大厂基础面试题
- Win10藏着如此多秘密!Win10这些模式你知多少
