Innodb的七种锁
1)共享锁(S锁)和排他锁(X锁)
S锁和X锁都是行级锁
共享锁:事务要读取某行记录时,需要获得该行的S锁
排他锁:事务要修改某行记录时,需要获得该行的X锁
当事务A获得某一行的S锁,事务B想要访问该行时:B请求S锁,二者都有S锁。B请求X锁,操作阻塞,被拒绝。当事务A获得某一行的X锁,事务B想要访问该行时:B请求S锁,操作阻塞,被拒绝。B请求X锁,操作阻塞,被拒绝。
兼容性 | S锁 | X锁 |
---|---|---|
S锁 | 兼容 | 不兼容 |
X锁 | 不兼容 | 不兼容 |
S锁和X锁也可以是表级别锁
此时,兼容性与行级别锁效果一样
2)意向锁
意向锁是表级锁,不与行级锁冲突
它是一个事务在未来某一时刻,可能要加S或X锁时声明的一个意向。
为什么需要意向锁?
答:S和X是相互排斥的。当事务A希望给某表加一个S锁,需要保证:
1)该表其他事务对该表没有排他锁
2)该表其他事务对该表的每一行都没有排他锁
为了不去遍历每一行,而产生了意向锁。意向锁的原理:
答:当事务A持有该表某一行的排他锁,此时该表就有意向排他锁和某一行的排他锁。
事务B要访问该表内容时,就会发现该表的意向排他锁,从而推断出,某事务必定持有该表的某一行的排他锁。
这样事务B的访问必然产生阻塞,不必去检测每一行的加锁情况。
意向共享锁:IS锁 格式select ... lock in share mode;
意向排他锁:IX锁 格式select ... for update;
兼容性 | S锁 | X锁 | IS锁 | IX锁 |
---|---|---|---|---|
S锁 | 兼容 | 不兼容 | 兼容 | 不兼容 |
X锁 | 不兼容 | 不兼容 | 不兼容 | 不兼容 |
IS锁 | 兼容 | 不兼容 | 兼容 | 兼容 |
IX锁 | 不兼容 | 不兼容 | 兼容 | 兼容 |
3)记录锁(record key)
记录锁是最简单的行锁,只锁住一行。
记录锁永远加在索引上,即使一个表没有索引,InnoDB也会隐式的创建一个索引,并使用这个索引实施记录锁。它会阻塞其他事务对这行记录的插入、更新、删除。
在索引上加记录锁:select k1 from test where k1=2 for update;
4)间隙锁(gap key)
间隙锁锁住的是一个区间,加在两个索引中间,或者第一个索引之前,或者最后一个索引之后。
间隙锁是为了解决幻读问题。
5)临键锁(next-key lock)
它是记录锁和间隙锁的组合。
next-ley lock锁住该索引本身以及索引之前的间隙。
锁区间是前开后闭。(x,y]
6)插入意向锁(insert intention)
在插入一行记录的操作之前的一种间隙锁,释放插入的信号。
多个事务,在同一个索引,同一个范围区间插入记录时,如果插入的位置不冲突,不会阻塞彼此。
兼容性 | 间隙锁 | 插入意向锁 | 记录锁 | 临键锁 |
---|---|---|---|---|
间隙锁 | 兼容 | 兼容 | 兼容 | 兼容 |
插入意向锁 | 不兼容 | 兼容 | 兼容 | 不兼容 |
记录锁 | 兼容 | 兼容 | 不兼容 | 不兼容 |
临键锁 | 兼容 | 兼容 | 不兼容 | 不兼容 |
7)自增锁
特殊的表级锁,针对AUTO_INCREMENT类型的列
如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。
补充说明:
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。解决死锁:
1)如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会;
2)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3)对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
4)如果业务处理不好可以用分布式事务锁或者使用乐观锁;
5)死锁与索引密不可分,解决索引问题,需要合理优化索引
Innodb的七种锁相关推荐
- mysql 聊聊InnoDB七种锁
前言 本文将跟大家聊聊InnoDB的锁.本文比较长,包括一条SQL是如何加锁的,一些加锁规则.如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的. 为什么需要加锁呢? InnoDB的七种锁 ...
- mysql x key 组合_技本功丨浅谈MySQL的七种锁
作者:宋丹琪(花名:三思)袋鼠云云服务部DBA团队 数据库工程师 时常会有开发的同学突然紧张兮兮地找我, 然后丢给我一个代码层面的 CannotAcquireLockException的报错, 一脸无 ...
- Java 并发编程必须知道的七种锁类型以及应用
锁是解决并发冲突的重要工具.在开发中我们会用到很多类型的锁,每种锁都有其自身的特点和适用范围. 需要深刻理解锁的理念和区别,才能正确.合理地使用锁. 常用锁类型 乐观锁与悲观锁 悲观锁对并发冲突持悲观 ...
- 浅谈MySQL的七种锁
一.共享锁(S锁)/排他锁(X锁) 事务拿到某一行记录的共享S锁,才可以读取这一行,并阻止别的事物对其添加X锁 事务拿到某一行记录的排它X锁,才可以修改或者删除这一行 共享锁的 ...
- 七种方案!探讨Redis分布式锁的正确使用姿势
前言 日常开发中,秒杀下单.抢红包等等业务场景,都需要用到分布式锁.而Redis非常适合作为分布式锁使用.本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式.如果有不正确的地方,欢迎大家 ...
- 数据事务四种隔离机制和七种传播行为
数据事务四种隔离机制和七种传播行为 一.隔离级别: 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Seria ...
- MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解
MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...
- 【多线程】学习记录七种主线程等待子线程结束之后在执行的方法
最近遇到一个问题需要主线程等待所有的子线程结束,才能开始执行,统计所有的子线程执行结果,返回,网上翻阅各种资料,最后记录一下,找到七种方案 第一种:while循环 对于"等待所有的子线程结束 ...
- 揭密Oracle之 七种武器
揭密Oracle之 七种武器 第一章 搭建测试环境 vage 揭密Oracle之 七种武器 第一章 搭建测试环境 (揭密Oracle之七种武器第二章地址:DTrace语法:跟踪物理IO http:/ ...
最新文章
- 科学家打造全套人工神经系统 帮助瘫痪病人重新控制身体
- C 语言编程 — 数据类型转换
- BZOJ4567 SCOI2016背单词(trie+贪心)
- 取消对 null 指针“l”的引用。_C语言编程笔记丨C 语言指针 5 分钟教程
- 鼠标点计算机再点网络也是选定,鼠标左键单击变双击,点一下变两下是什么原因?...
- MySQL配置+SQLyog安装教程
- 开关稳压器工作原理与典型应用电路分析——LM2576、LM2596与LM2577
- 全国大学生电子设计竞赛(七)--逆变电源设计
- [爬虫系列(三)]用多线程爬取百度贴吧默认表情
- java实现xls转换为xlsx
- sql语句实现查询实例
- 体验魅力Cognos BI 10 系列,第1 部分: 第一次安装
- W10的AndroidStudio4.0.1的下载安装与配置
- android时间控制器,android UiAutomator长按实现控制按住控件时间的方法
- BH1750的一些使用心得(STM32,内置工程)
- MIPI RFFE协议使用不完全指南(附上代码详解和参考资料)第一部分
- MySQL语句的条件查询
- 什么是soft matting方法_NMS、 soft-nms、softer-nms
- 在k8s上安装Jenkins及常见问题
- 英语否定词语表达例析
热门文章
- 《GRACE: Gradient Harmonized and Cascaded Labeling for Aspect-based Sentiment Analysis》阅读笔记
- Latex基础命令入门
- windows驱动ddk环境设置
- JSTL【一】C标签的使用
- 基于SQLSERVER--数据库表的修复
- 量子计算机分解时间,量子计算机如何分解两个质数乘积
- 解决neural-renderer-pytorch编译安装问题
- MySQL数据库之设置密码修改密码用户名
- insmod: error inserting 'memdev.ko': -1 File exists
- RevitAPI: 修改视图View裁剪区域Cropbox的大小