关于间隙锁,你应该在很多资料上有看到过对它的解释,那么你是否完全掌握了间隙锁呢?这里就通过一个测试题,验证一下你是否理解间隙锁。
首先是建表语句:
use muke;
drop table if exists t17_1;
CREATE TABLE `t17_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
`c` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_a` (`a`) USING BTREE,
KEY `idx_c` (`c`)
) ENGINE=InnoDB CHARSET=utf8mb4;
insert into t17_1(id,a,b,c) values (1,1,1,1),(3,4,2,5),(5,3,4,3),(7,7,7,7);
查询一下全表数据:
select * from t17_1;
然后进行下面实验:
session1 | session2 | session3 |
---|---|---|
set session transaction_isolation='REPEATABLE-READ';/* 设置会话隔离级别为RR*/ | set session transaction_isolation='REPEATABLE-READ';/* 设置会话隔离级别为RR*/ | set session transaction_isolation='REPEATABLE-READ';/* 设置会话隔离级别为RR*/ |
begin; | ||
use muke; select * from t17_1 where c=5 for update; ...... 1 row in set (0.00 sec) | ||
insert into t17_1 values (2,2,2,2);/* sql1 */ | insert into t17_1 values (6,6,6,6);/* sql2 */ | |
commit; |
那么在 session1 提交之前,sql1 和 sql2 是否能写入成功?原因是什么?欢迎在留言区参与讨论。
如果你不知道原因,欢迎订购我的慕课网专栏《一线数据库工程师带你深入理解 MySQL》,在专栏的第 17 节中详细讲解了间隙锁。
专栏知识图如下:
另外,我们创建了一个 MySQL 交流社群,围绕开发、运维、DBA、架构师和其他需要用到 MySQL 的群体,群内会不定期邀请一些身边的数据库大牛解答大家的问题,也会分享一些读书笔记、面试技巧等,同时也用于大家交流 MySQL 的学习技巧!
入群请加下方群秘二维码,回复 MySQL,等待群秘邀你入群。
本文分享自微信公众号 - MySQL数据库联盟,如有侵权,请联系 service001@enmotech.com 删除。
最后修改时间:2019-12-20 11:33:16
文章转载自MySQL数据库联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。