美团二面时被问到MySQL的InnoDB锁的类型和区别,答完以后面试官说整体是对的,但是细节上有点问题,想问问各路大神,这样回答是哪里不对吗?回答如下:
共享锁与排他锁:
lock in share mode:共享锁,可用于读锁
for update:排他锁,可用于写锁
共享锁与排他锁之间互相排斥(读写互斥)
共享锁与排他锁之间不排斥(读读共享)
排他锁与排他锁之间互相排斥(写写互斥)
InnoDB有行级锁(行级别)。
主键索引或唯一索引:行级锁
非唯一索引:Next-Key Lock = 行级锁+间隙锁gap(防止幻读)
无索引:退化为表级锁
InnoDB有意向锁(表级别)。
当其他事务需要获取表级锁时(如:无索引退化未表级锁),需要逐行检查是否其他事务获取了行级锁,效率会低。因此当其他事务获取锁时,会加一个意向锁,这样当其他事务需要获取表级锁时就不用逐行检查,只要判断是否有意向锁就可以了,有则阻塞。
共享锁与排他锁:
lock in share mode:共享锁,可用于读锁
for update:排他锁,可用于写锁
共享锁与排他锁之间互相排斥(读写互斥)
共享锁与排他锁之间不排斥(读读共享)
排他锁与排他锁之间互相排斥(写写互斥)
InnoDB有行级锁(行级别)。
主键索引或唯一索引:行级锁
非唯一索引:Next-Key Lock = 行级锁+间隙锁gap(防止幻读)
无索引:退化为表级锁
InnoDB有意向锁(表级别)。
当其他事务需要获取表级锁时(如:无索引退化未表级锁),需要逐行检查是否其他事务获取了行级锁,效率会低。因此当其他事务获取锁时,会加一个意向锁,这样当其他事务需要获取表级锁时就不用逐行检查,只要判断是否有意向锁就可以了,有则阻塞。
全部评论
膜拜大佬,真的难
我觉得面试官想你说说MVCC,现在就算是事务,默认也是不加for update和lock in share mode,最常用的你没说
这不答得挺好的
主键索引或唯一索引:如果等值匹配找不到的话, 是不是会退化成 间隙锁呀?
除了for update也是适用于读锁之外,感觉也没啥问题
字节跳动校招内推码: HC9H2MF
投递链接: https://jobs.toutiao.com/s/FNmxaGn
本部门 JAVA 实习(三亚,北京,上海,杭州都可以奥):
字节跳动校招内推码: HC9H2MF
投递链接: https://jobs.toutiao.com/s/FNmmYYc
map.put(0,' w');
map.put(1,'a');
map.put(2,'n');
map.put(3,'g');
map.put(4,'w');
map.put(5,'e');
map.put(6,'n');
map.put(7,'h');
map.put(8,'a');
map.put(9,'n');
map.put(10,'2013');
Print('W_ _X',' map.values()')
可沟通进度等
问到一样的了,问我myIsam和innodb的区别
相关推荐