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

1、行锁

测试:
item表, 在id、price字段上加锁。

打开两个窗口。 分别关闭自动提交:set autocommit=0;

1.1、字段存在索引,行锁

a窗口执行:

update item2 set stat = 1 where price = 1500;

b窗口执行:

update item2 set stat = 1 where price = 30;


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

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

a窗口执行:

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

b窗口执行:

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


由于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.3.1、联合索引生效的情况

a窗口执行:

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

b窗口执行:

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


联合索引只要where查询索引生效,依然只会锁定行,不会影响其他行的更新。

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

a窗口执行:

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

b窗口执行:

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


如果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;

b窗口执行

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

c窗口执行:

update item2 set stat = 1 where price = 300;



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

mysql的行锁和间隙锁相关推荐

  1. 跑了4个实验,实战讲解 MySQL的行锁、间隙锁...​

    今天跟大家聊一聊MySQL的事务隔离,并通过一些实验做了些总结.光说不练,假把式,没有经过实践就没有话语权. 我们都知道数据库有四种隔离级别,分别是: 读未提交(READ UNCOMMITTED) 读 ...

  2. mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

    详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC  ...

  3. mysql ansi sql标准_Mysql数据库隔离级别(ANSI SQL92规范,行锁,间隙锁)

    一. 什么是数据库隔离级别? ANSI(美国国家标准学会:AMERICAN NATIONAL STANDARDS INSTITUTE)在多个事务并发的时候能够正确的处理数据所定义的规范.事务隔离级别越 ...

  4. MySQL - 全局锁、表级锁、行级锁、元数据锁、自增锁、意向锁、共享锁、独占锁、记录锁、间隙锁、临键锁、死锁

    # 前言 本篇只介绍 MySQL 锁的基本知识. 我的 MySQL 版本是 MySQL 5.7.34, 建议使用 MySQL 5.6 及之后的版本. ## 先上一个图 ## 为什么要使用锁? 个人理解 ...

  5. 【Java面试题】6年开发去A里面试P6竟被Mysql难住了,说一下你对行锁、临键锁、间隙锁的理解

    一个工作了6年的程序员,最近去阿里面试p6这个岗位. 面试之前信心满满的和我说,这次一定要拿下 35k月薪的offer. 然后,在第一面的时候,被Mysql里面的一个问题难住了. 大家好,我是Mic, ...

  6. MySQL 行级锁(行锁、临键锁、间隙锁) 小白教程

    一.行级锁 行级锁,每次操作锁住对应的行数据.锁定粒度最小,发生锁冲突的概率最低,并发度最高.应用在InnoDB存储引擎中. InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的 ...

  7. Mysql里的锁(排它锁、共享锁、行锁、表锁、间隙锁、临键锁、意向锁)

    一.加锁的目的是什么? 在我们了解数据库锁之前,首先我们必须要明白加锁的目的是为了解决什么问题,如果你还不清楚的话,那么从现在起你应该知道,数据库的锁是为了解决事务的隔离性问题,为了让事务之间相互不影 ...

  8. mysql 插入加锁_Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

    你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁. 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁. 生活中的间隙 ...

  9. 推荐:mysql锁 innodb下的记录锁,间隙锁,next-key锁

    你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁. 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁. 生活中的间隙 ...

  10. 行锁、间隙锁、next-key锁

    参考博客:cmysql锁(九)innodb下的记录锁,间隙锁,next-key锁 - 简书 Mysql 行锁.间隙锁和next-key锁详解_程序员掉头发的博客-CSDN博客_行锁 间隙锁 行锁(Re ...

最新文章

  1. 验证ArrayList是线程不安全的集合
  2. 站长新手入门:从0开始搭建微信小程序商城,不会代码也能开商城(附带源码)
  3. 吴穹博士谈软件工程未来发展趋势
  4. sublime text3 怎么配置、运行python_SublimeText3按ctrl+b执行python无反应
  5. python3读取excel方法封装_python-excel读写封装
  6. “同一天生日”网络募捐被疑造假,为什么却成了程序员的锅?
  7. linux usb 同步传输,从设备到主机的用户模式USB等时传输
  8. Linux 学习手记(5):使用Vim文本编辑器
  9. 基于内容和用户画像的个性化推荐
  10. Windows下C语言多线程函数_beginthread简单入门应用例子
  11. 七大江河水系--海河
  12. easypoi 合并单元格 横向 纵向
  13. C语言scanf()和gets()及printf()和puts()的区别
  14. burpsuite的基本使用
  15. emule-Xtreme(电驴)
  16. MAC升级Ruby版本
  17. python获取本机IP的方法
  18. 《C语言常见问题集》 -- 摘录和C学习资源(部分已下载)
  19. SitePoint播客#156:重访Paywalls
  20. USACO 2018JAN Silver

热门文章

  1. 什么是Java虚拟机
  2. collectgarbage
  3. 【React】使用 react-pdf 将数据渲染为pdf并提供下载
  4. C++开发报错之 “模块计算机类型x64与目标计算机x86类型冲突”
  5. celery变量共享
  6. cn2 gia、cn2 gt和普通线路之间区别和联系
  7. 8年软件测试工程师职业生涯感悟—写给正在迷茫的你
  8. android nfc 命令,带有APDU命令的Android NFC问题
  9. Premiere高分辨率视频代理加速预览解决卡顿ProxyPresets v3版PR预设下载
  10. 【计算机网络原理之TCP】