请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

表级锁和gap锁

老师您好,您这节课4分30秒描述innodb在sql没有用到索引的时候用的是表级锁,sql在用到索引的时候用的是行级锁和gap锁。但是您在3-17的20分37秒时描述不走索引会对所有的gap都上锁相当于表锁。请您解释下?

正在回答 回答被采纳积分+3

1回答

翔仔 2019-06-21 00:30:11

同学好,同学听得真细,探索精神非常棒,前面因为我们没有讲到gap锁行锁相关的详细内容,所以暂且理解为走表锁,实际上在不走索引的时候,InnoDB的实现方式和MyIsam的表锁方式不同,

单条索引记录上加锁,record lock锁住的永远是索引,而非记录本身,即使该表上没有任何索引,那么innodb会在后台创建一个隐藏的聚集主键索引,那么锁住的就是这个隐藏的聚集主键索引。所以说当一条sql没有走任何索引时,那么将会在每一条聚集索引后面加X锁,此时想改变树型结构即索引结构的话,是会被锁住的,这个类似于表锁,但原理上和表锁是完全不同的 :)


0 回复 有任何疑惑可以回复我~
  • 提问者 慕函数0577617 #1
    X锁和gap锁冲突吗。我理解的是在innoDB不索引的时候,在rc和runc级别下会在每一条聚集索引后面加X锁,而在rr和串行化级别下不但会上x锁还会上gap锁,意思就是x锁和事务隔离级别并没有关系,而gap锁和事务隔离级别有关系只有在rr和串行化下才有,是这样吗?
    回复 有任何疑惑可以回复我~ 2019-06-21 13:56:48
  • 提问者 慕函数0577617 #2
    RR和串行化级别下不走索引将会在每一条聚集索引后面加X锁即recordlock相当于锁表,还会加gap锁。前者已经保证锁表了,为什么还要加gap锁啊?
    回复 有任何疑惑可以回复我~ 2019-06-21 15:28:46
  • 翔仔 回复 提问者 慕函数0577617 #3
    同学好,X即排它锁,就是行锁,跟gap不冲突。锁和事务隔离级别之间并不存在直接关系,只是事务隔离级别会通过锁等机制来实现,第一个问题是这样的。第二个问题的话,就是对索引树加上锁,不给树的结构发生变化,即包括行锁和gap锁。只加行锁的话并没办法确保在行之间插入数据,也就是往父节点下面添加叶子节点,而加入间隙锁,就好比锁住父节点不让改变表结构,这样就能保证锁住间隙
    回复 有任何疑惑可以回复我~ 2019-06-21 22:56:54
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信