更新操作怎么上锁?
-
例如有字段a,b,c,其中a,b字段上有索引
-
update table set a = 1 where a = 2; 该SQL会先去a索引获取锁,然后去聚集索引获取锁,全部获取到后进行更新,不会去b索引上获取锁,因为该SQL没有更新b索引上数据(b索引的叶子节点数据只有b和id)。此时更新聚集索引是直接更新, 但更新a索引是先删后插的形式,以此来保证索引更新前后的有序性
-
update table set id = 1 where a = 2;该SQL会先去a索引获取a=2锁,然后去聚集索引获取锁,然后去b索引上获取锁(隐式锁),全部获取到后进行更新,更新各个索引的数据页的id值,此时更新聚集索引是先删后插保证索引有序性,a和b索引都是直接更新对应记录的id即可
-
update table set c = 3 where a = 2;该SQL会先去a索引获取a=2的锁,然后去聚集索引获取锁,然后更新c
删除操作会上什么锁?
和更新操作差不多,根据where后面的条件,看先去哪个索引上删除,例如 where id = 1,就先去聚集索引获取锁,聚集索引获取到锁后再去各个辅助索引获取到对应的锁,只有获取到全部索引上的锁后才能真正的删除,否则阻塞;如果是where a = 1,那就先去a这个索引上获取锁,获取到后再去聚集索引获取锁,然后再去其它索引树上获取,同样只有获取到全部索引上的锁后才能真正的删除,否则阻塞
-
对于唯一索引:如果要删的数据不存在,则上间隙锁,锁住不存在的那块间隙;如果存在,则上记录锁
-
对于非唯一索引:如果要删的数据不存在,则上间隙锁,锁住不存在的那块间隙;如果存在,上临键锁(可重复读及以上隔离级别),开始扫描符合条件的记录,这时如果发生阻塞(记录锁之间的阻塞,间隙锁可以共存),就直接阻塞,直到对方释放锁,然后才继续扫描剩下符合条件的记录,上锁算法与上面相同,也会对扫到的数据去聚集索引上上锁
删除和更新操作区别?
讲白了,MySQL中的删除就是更新操作,因为其本身就是逻辑删除,把行格式中的一个标识位更改了,就是删除了,所以要去全部辅助索引上获取锁,而更新操作则是只会去需要更新的索引上(索引叶子节点一般只有索引键和id还有行格式标识符,所以修改行格式需要全部地方都改)获取锁。另外就是更新操作如果在某个索引上更新的是索引字段的值,是先删后插的