MySQL随笔-生活工作点滴

不同SQL语句在InnoDB中产生的锁

2019-07-05  本文已影响8人  wangjie_yy

原文地址

一般来说,加锁读UPDATE,或者DELETE这些SQL语句,会在执行时扫描的每一条记录上加记录锁,无论语句中的WHERE条件是否将某一行排除在外。InnoDB不会记得WHERE条件是什么,只能知道扫描了哪些索引。 这里加的锁通常都是next-key锁,会阻塞向当前记录前面的一段"间隙"里面插入数据的操作。[间隙锁]可以显示的禁用,从而也就不会产生next-key锁。更多信息可以查看InnoDB中的锁。事务隔离级别也会影响加锁的机制,参考事务隔离级别

如果在查询中使用了辅助索引,并且在辅助索引记录上加了排它锁,InnoDB同时也会在相应的聚集索引记录上加上锁。

如果在你的语句中没有合适的索引可以使用,MySQL必须要扫描整个表来处理,表中的每一行都会被锁住,从而阻塞了其他用户往表中插入数据。创建良好的索引非常重要,它可以让你的查询无需扫描很多行记录。

InnoDB设置各种锁的机制如下:

上一篇下一篇

猜你喜欢

热点阅读