InnoDB中不同SQL加锁类型

2021-06-30  本文已影响0人  后厂村老司机

前言

上一篇博客中我们分析了事务死锁过程,给出的结论是其中delete操作和insert操作分别加了gap lock和insert intention lock,但具体什么sql会加什么锁呢?我们本篇来分析下

不同SQL加锁类型

1、检索的时候使用辅助索引会给索引到的相关行设置排他锁,同时InnoDB会给关联的聚簇索引相关行设置排他锁
2、如果检索时没有使用索引,那么InnoDB会对表里的每一行加上next-key lock,此时禁止插入
3、select from在 [SERIALIZABLE]隔离级别下回给检索到的行加上共享的next-key lock
4、select for update或者select lock in share mode会给检索到的行加next-key lock,特殊情况是where条件里的索引是唯一索引并且检索的是唯一行只会加行锁
5、update where 会给检索到的行加next-key lock,特殊情况是where条件使用唯一索引检索唯一行只会加行锁
6、update修改聚簇索引记录,比如修改主键,会给当前行关联的辅助索引加上锁;
7、delete from where 会给检索到的行加next-key lock,特殊情况是使用唯一索引检索唯一行只会加行锁
8、insert操作会给插入的行加行锁,在插入之前会设置插入意向锁的gap lock,多个事务如果插入不同行插入意向锁不会阻塞事务
9、replace操作和insert一致,但是如果要替换的唯一索引已经存在,那么就会加next-key lock
10、insert into T seelct from s where 会设置行锁,

总结

上述是从官方文档(https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html)摘录的比较常用的sql。
总结起来看就是update delete 操作会加next-key lock,insert多了一种插入意向锁

上一篇下一篇

猜你喜欢

热点阅读