mysql索引冲突_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)
1.使用相同索引键值的冲突
由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的。设计时要注意
例如:city表city_id字段有索引,Cityname字段没有索引:
会话1
会话2
SET autocommit=0;
SET autocommit=0;
SELECT * FROM city WHERE city_id=14 AND Cityname='深圳' FOR UPDATE;
city_id country_id cityname CityCode
14 2 深圳 001
会话2与会话1访问的是不同的记录,但是因为使用了相同的索引值,所以需要等待锁
SELECT * FROM city WHERE city_id=14 AND Cityname='长沙' FOR UPDATE;
等待...
2.使用不同索引键值但是同一行的冲突
当表有多个索引时候,不同的事务可以使用不同的索引锁定不同的行,无论什么索引,innodb都会使用行锁来对数据加锁。
例如city表city_id字段有主键索引,CityCode字段有普通索引:
会话1
会话2
SET autocommit=0;
SET autocommit=0;
SELECT * FROM city WHERE city_id=14 FOR UPDATE;
city_id country_id cityname CityCode
14 2 深圳 001
该记录没有被索引,所以可以获得锁
SELECT * FROM city WHERE CityCode='002' FOR UPDATE;
city_id country_id cityname CityCode
15 2 长沙 002
由于该记录被会话1锁定,所以需要等待
SELECT * FROM city WHERE CityCode='001' FOR UPDATE;
等待...
3. 创建了索引,但使用的是表锁
在前面章节说过,创建了索引但不走索引的情况,这种情况下innodb将使用表锁,而不是行锁,因些分析锁冲突时,还需检查sql的执行计划,以确认是否真正使用了索引。
4. 间隙锁(next-key锁) 并发下要重点考虑
当我们用范围条件而不是相等条件检索数据,并请求共享或排它锁时,innodb会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录就叫做"间隙锁" 比如city表数据分布如下:
如果查询使用如下sql
select * from city where city_id>100 for update;
这就是一个范围条件的检索, innodb不但会对符合条件的101的记录加锁,也会对city_id大于101(虽然记录并不存在)的"间隙"加锁。使用间隙锁的目的是为了防止幻读,以满足相关的隔离级别。关于幻读查看"sql 开发进阶篇系列 6 锁问题(事务与隔离级别介绍)"
很明显,在使用范围条件的检索记录时, 会阻塞符合条件范围内键值的并发插入,往往造成严重的锁等待。在实现业务中尽量使用相等条件来检索数据。还需注意如查使用相等条件检索的数据不存在时,也会加间隙锁。
为了防止幻读,mysql隔离级别必须是REPEATABLE-READ和Serializable。REPEATABLE-READ也是默认的隔离级别。
会话1
会话2
SELECT @@tx_isolation
@@tx_isolation
REPEATABLE-READ
SELECT @@tx_isolation
@@tx_isolation
REPEATABLE-READ
SET autocommit=0;
SET autocommit=0;
-- 当前会话对不存在的记录加 for update;
SELECT * FROM city WHERE city_id=102 FOR UPDATE;
如果这里插入的值>=102就会出现阻塞
INSERT INTO city VALUES(200,2,'江门','005')
错误代码: 1205
Lock wait timeout exceeded; try restarting transaction
ROLLBACK;
INSERT INTO city VALUES(200,2,'江门','005')
共 1 行受到影响
mysql索引冲突_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)相关推荐
- mysql行锁同索引键问题_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)
1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...
- mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)
1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...
- mysql 插入加锁_Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁
你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁. 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁. 生活中的间隙 ...
- mysql存储引擎 索引优化_MySQL存储引擎,索引及基本优化策略
存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有 ...
- mysql防止索引崩溃_MySQL优化之避免索引失效的方法
在上一篇文章中,通过分析执行计划的字段说明,大体说了一下索引优化过程中的一些注意点,那么如何才能避免索引失效呢?本篇文章将来讨论这个问题. 避免索引失效的常见方法 1.对于复合索引的使用,应按照索引建 ...
- mysql 字符串索引 优化_MySQL性能优化之索引调优实战
索引失效场景或使用注意事项 a.索引无法存储null值,所以建议都给默认值 b.如果条件中有or,即使使用了索引条件也不起作用,所以尽量少用or 如果想使用or,又让索引生效,只能将or的每个列上加上 ...
- mysql b tree索引原理_MySQL中B+Tree索引原理
B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...
- mysql s索引 树_mysql 学习 - B+树索引
我们已经知道在单一数据页中查找数据时, 如果查找条件是主键的话, 可以使用二分法定位槽, 然后顺序遍历槽中的数据查找指定数据. 但是我们并不知道如何在数以万计的页中定位数据在哪个页中, 在没有索引的情 ...
- mysql联合索引案例_mysql多个联合索引的案例分析
mysql多个联合索引的案例分析 发布时间:2020-11-23 14:54:29 来源:亿速云 阅读:61 作者:小新 小编给大家分享一下mysql多个联合索引的案例分析,相信大部分人都还不怎么了解 ...
- mysql 创建索引失败_mysql创建多列索引及优化 - 没有所谓的失败!除非你不再尝试! - PHPChina ......
什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面 ...
最新文章
- x86架构手机_都是芯片,为什么电脑CPU不能用在手机里?
- ssm 异常捕获 统一处理_SpringMVC 统一异常处理介绍及实战
- GRADE:联合学习演化节点和社区表示的概率生成模型
- 64位系统下使用ODP.NET 11g的异常
- bootstrap行内编辑后提交多条数据到ssm
- 计算机术语中英文cat表示,pcb 专业术语 中英文对照三
- 微信小程序搜索多个关键字高亮
- botley编程机器人测评_浅谈少儿编程教育启蒙----教具篇
- ubuntu 如何登录远程服务器_VSCode远程登录云服务器、树莓派实现在线调试代码...
- openoffice 安装windows 环境
- 1000 驱动_布加迪首款SUV渲染图曝光!采用纯电驱动,马力或将突破1000匹!
- 组件是全局怎么修改样式_用一个落地项目,帮你掌握Sketch组件的制作思路
- iOS / OXS LeanCloud云存储方案简单测试记录
- paip.得到程序运行实际命令
- 在vs中进行qt桌面应用开发时,编译器堆溢出的编译错误(error C1060编译器堆内存不足)
- 电视网络机顶盒破解记录
- 微信小程序搜索排名算法
- 服务器重装系统之DELL
- 2018.09.02【BZOJ2227】【ZJOI2011】看电影 (高精度)(组合数)
- Suggestion: use tools:overrideLibrary=xxx.xxx.xxx to force usage
热门文章
- oracle unused 语法_【转】Oracle set unused的用法
- oracle32转64,Oracle10g下载地址--多平台下的32位和64位 (转)
- 创建查看mysql8.0数据库_创建和选择数据库
- 企业微信应用权限签名api记录
- stream rabbit
- CoreOS镜像更新
- 原生ES-Module在浏览器中的尝试
- “密码人”越来越多将会出现“密码危机”
- C++辨析系列谈 [作者: 郑力群]
- 警惕那些产生负价值的开发者