锁与索引和释放锁时机

简介: 【8月更文挑战第1天】

在MySQL的InnoDB引擎里,锁是借助索引来实现的,加锁锁住的其实是索引项,更加具体的说,是锁住了叶子节点

引出的问题:

  1. 一个表有很多索引,锁的是哪个索引呢?
    答案是 查询最终使用的索引
  2. 万一查询没有使用任何索引呢?
    那么就会锁住整个表,此时退化为表锁。
  3. 如果查询条件的值不存在,怎么锁?比如SELECT * FROM your_tab WHERE id = 15 FOR UPDATE

InnoDB引擎会利用最接近15的相邻的两个节点,构造一个临键锁
如果这个时候别的事务想要插入一个id=15的记录,就不会成功

  1. 那么范围查询呢?
    利用索引上的数据,构建一个恰好能够装下这个范围的临键锁,例如 :SELECT * FROM your_tab WHERE id > 33 FOR UPDATE,InnoDB引擎会构造一个(33,supremum]的临键锁,锁住整个范围。supremum是MySQL认为的一个虚拟的最大值

通过上述可以得出一个结论:锁和索引密切相关

学习锁的时候容易有一个误区:认为锁是在语句执行完毕之后就立刻释放掉。
事实上,锁是在整个事务结束之后才释放的。也就是说,当一个事务内部给数据加上锁之后,只有执行Rollback或Commit的时候,锁才被释放掉

目录
相关文章
|
JSON 运维 JavaScript
教你如何快速接入微信消息通知,使用消息推送服务,「传息」推送消息到个人微信
教你如何快速接入微信消息通知,使用消息推送服务,「传息」推送消息到个人微信
1786 0
|
4月前
|
数据库 索引 关系型数据库
乐观锁和悲观锁+行锁和表锁
【8月更文挑战第2天】
59 8
|
XML 弹性计算 网络协议
阿里云ECS+frpc/frps+RDP_CnC 实现内网穿透远程桌面,无公网家庭版Win10台式机变身远程工作站
本文是实操笔记,记录了通过自建内网穿透和解锁 Windows 10 Home 的远程桌面功能,将没有公网 IP 的家用台式机配置成远程工作站的大致过程。在此过程中我练习了简单的 Linux 系统操作,了解了一些实用的服务器工具软件(如文中提到的 frpc/frps 套件与 Windows 系统上的 WinSW 服务封装工具)。
1627 0
|
3月前
|
NoSQL 前端开发 Java
【幂等性大坑】事务提交前释放锁导致锁失效问题
在事务中,使用了 Redis 分布式锁.这个方法一旦执行,事务生效,接着就 Redis 分布式锁生效,代码执行完后,先释放 Redis 分布式锁,然后再提交事务数据,最后事务结束。如果是表单重复提交场景,可以尝试给“订单号”等有唯一性的字段加唯一索引,这样重复提交时会因为唯一索引约束导致索引失效。5、如果表的一个字段,要作为另外一个表的外键,这个字段必须有唯一约束(或是主键),如果只是有唯一索引,就会报错。2、创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引。
【幂等性大坑】事务提交前释放锁导致锁失效问题
|
4月前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
7月前
|
API
什么是接口幂等
什么是接口幂等
200 0
|
7月前
|
NoSQL Java Redis
Spring boot 实现监听 Redis key 失效事件
【2月更文挑战第2天】 Spring boot 实现监听 Redis key 失效事件
616 0
|
NoSQL 关系型数据库 索引
从一个案例深入剖析InnoDB隐式锁和可见性判断(1)
从一个案例深入剖析InnoDB隐式锁和可见性判断
从一个案例深入剖析InnoDB隐式锁和可见性判断(1)
|
SQL 关系型数据库 MySQL
从一个案例深入剖析InnoDB隐式锁和可见性判断(2)
从一个案例深入剖析InnoDB隐式锁和可见性判断
146 0
从一个案例深入剖析InnoDB隐式锁和可见性判断(2)
|
7月前
|
关系型数据库 MySQL 数据库
【mysql】当前读和快照读,幻读和可重复读
【mysql】当前读和快照读,幻读和可重复读
404 0