• mysql的行锁和间隙锁


    无论是update还是select for update,只要where条件里面字段没有带索引,都会把整个表锁住。如果更新的行上存在索引,更新时锁定被更新的记录。

    1、行锁

    测试:
    item表, 在id、price字段上加锁。
    在这里插入图片描述
    打开两个窗口。 分别关闭自动提交:set autocommit=0;

    1.1、字段存在索引,行锁

    a窗口执行:

    update item2 set stat = 1 where price = 1500;
    
    • 1

    b窗口执行:

    update item2 set stat = 1 where price = 30;
    
    • 1

    在这里插入图片描述
    由于price字段存在索引,a窗口的更新语句只锁定了price=1500的一条记录。b窗口正常更新price=30的记录。

    1.2、字段不存在索引,表锁

    a窗口执行:

    update item2 set stat = 1 where name= 'dd';
    
    • 1

    b窗口执行:

    update item2 set stat = 1 where price = 'ee';
    
    • 1

    在这里插入图片描述
    由于name字段没有索引,a窗口where限定中name=‘dd’, 没有commit之前, b窗口查询name=‘ee’ 的记录还是被阻塞了。所以如果字段没有索引,在更新时会执行表锁。

    1.3、联合索引的情况

    新建一个name, address, port三个字段上的联合索引

    create index index_name_address_port on item2(name,address,port);
    
    • 1

    在这里插入图片描述

    1.3.1、联合索引生效的情况

    a窗口执行:

    update item2 set stat=1 where name = 'cc4' and address='张家村';
    
    • 1

    b窗口执行:

     update item2 set stat=1 where name = 'ff' and address='bcbc';
    
    • 1

    在这里插入图片描述
    联合索引只要where查询索引生效,依然只会锁定行,不会影响其他行的更新。

    1.3.2、联合索引没生效的情况

    a窗口执行:

    update item2 set stat=1 where address='张家村' and port='67';
    
    • 1

    b窗口执行:

    update item2 set stat=1 where address='bcbc' and port='24';
    
    • 1

    在这里插入图片描述
    如果where条件中的联合索引失效,依然会锁定整张表。

    联合索引生效条件

    Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。


    2、间隙锁

    行锁的一种特殊情况:间隙锁:值在范围内,但却不存在
    a窗口执行:

     update item2 set stat = 1 where price>100 and price<400;
    
    • 1

    b窗口执行

     INSERT INTO `item2` VALUES (12, 'gt', 'vxc', 234, 288, NULL, NULL);
    
    • 1

    c窗口执行:

    update item2 set stat = 1 where price = 300;
    
    • 1

    在这里插入图片描述
    在这里插入图片描述
    a窗口执行后,b,c窗口都阻塞了。 说明(100,400)的记录都被锁住了。无法插入price在100-400之前的记录, 即使price=288的记录还不存在,可以避免幻度。也无法更新100-400之前已经存在的记录。

  • 相关阅读:
    访问学者在国外需要特别注意的安全问题
    JDBC笔记
    【附源码】Python计算机毕业设计食堂在线点餐系统小程序
    【保姆级】手把手Debug循环依赖的整体流程
    架构中的“大象”
    CVE-2022-22954-VMware Workspace ONE Access SSTI远程代码执行流量特征
    C语言 不换行了程序输出%1到%100
    【MySQL】增删查改CURD(基础版)
    Spring自动加载数据几种方式执行顺序
    【C#】WPF获取屏幕分辨率
  • 原文地址:https://blog.csdn.net/qq_38205881/article/details/126087733