mysql的行锁和间隙锁
无论是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的行锁和间隙锁相关推荐
- 跑了4个实验,实战讲解 MySQL的行锁、间隙锁...
今天跟大家聊一聊MySQL的事务隔离,并通过一些实验做了些总结.光说不练,假把式,没有经过实践就没有话语权. 我们都知道数据库有四种隔离级别,分别是: 读未提交(READ UNCOMMITTED) 读 ...
- mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)
详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC ...
- mysql ansi sql标准_Mysql数据库隔离级别(ANSI SQL92规范,行锁,间隙锁)
一. 什么是数据库隔离级别? ANSI(美国国家标准学会:AMERICAN NATIONAL STANDARDS INSTITUTE)在多个事务并发的时候能够正确的处理数据所定义的规范.事务隔离级别越 ...
- MySQL - 全局锁、表级锁、行级锁、元数据锁、自增锁、意向锁、共享锁、独占锁、记录锁、间隙锁、临键锁、死锁
# 前言 本篇只介绍 MySQL 锁的基本知识. 我的 MySQL 版本是 MySQL 5.7.34, 建议使用 MySQL 5.6 及之后的版本. ## 先上一个图 ## 为什么要使用锁? 个人理解 ...
- 【Java面试题】6年开发去A里面试P6竟被Mysql难住了,说一下你对行锁、临键锁、间隙锁的理解
一个工作了6年的程序员,最近去阿里面试p6这个岗位. 面试之前信心满满的和我说,这次一定要拿下 35k月薪的offer. 然后,在第一面的时候,被Mysql里面的一个问题难住了. 大家好,我是Mic, ...
- MySQL 行级锁(行锁、临键锁、间隙锁) 小白教程
一.行级锁 行级锁,每次操作锁住对应的行数据.锁定粒度最小,发生锁冲突的概率最低,并发度最高.应用在InnoDB存储引擎中. InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的 ...
- Mysql里的锁(排它锁、共享锁、行锁、表锁、间隙锁、临键锁、意向锁)
一.加锁的目的是什么? 在我们了解数据库锁之前,首先我们必须要明白加锁的目的是为了解决什么问题,如果你还不清楚的话,那么从现在起你应该知道,数据库的锁是为了解决事务的隔离性问题,为了让事务之间相互不影 ...
- mysql 插入加锁_Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁
你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁. 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁. 生活中的间隙 ...
- 推荐:mysql锁 innodb下的记录锁,间隙锁,next-key锁
你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁. 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁. 生活中的间隙 ...
- 行锁、间隙锁、next-key锁
参考博客:cmysql锁(九)innodb下的记录锁,间隙锁,next-key锁 - 简书 Mysql 行锁.间隙锁和next-key锁详解_程序员掉头发的博客-CSDN博客_行锁 间隙锁 行锁(Re ...
最新文章
- 验证ArrayList是线程不安全的集合
- 站长新手入门:从0开始搭建微信小程序商城,不会代码也能开商城(附带源码)
- 吴穹博士谈软件工程未来发展趋势
- sublime text3 怎么配置、运行python_SublimeText3按ctrl+b执行python无反应
- python3读取excel方法封装_python-excel读写封装
- “同一天生日”网络募捐被疑造假,为什么却成了程序员的锅?
- linux usb 同步传输,从设备到主机的用户模式USB等时传输
- Linux 学习手记(5):使用Vim文本编辑器
- 基于内容和用户画像的个性化推荐
- Windows下C语言多线程函数_beginthread简单入门应用例子
- 七大江河水系--海河
- easypoi 合并单元格 横向 纵向
- C语言scanf()和gets()及printf()和puts()的区别
- burpsuite的基本使用
- emule-Xtreme(电驴)
- MAC升级Ruby版本
- python获取本机IP的方法
- 《C语言常见问题集》 -- 摘录和C学习资源(部分已下载)
- SitePoint播客#156:重访Paywalls
- USACO 2018JAN Silver