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的七种锁相关推荐

  1. mysql 聊聊InnoDB七种锁

    前言 本文将跟大家聊聊InnoDB的锁.本文比较长,包括一条SQL是如何加锁的,一些加锁规则.如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的. 为什么需要加锁呢? InnoDB的七种锁 ...

  2. mysql x key 组合_技本功丨浅谈MySQL的七种锁

    作者:宋丹琪(花名:三思)袋鼠云云服务部DBA团队 数据库工程师 时常会有开发的同学突然紧张兮兮地找我, 然后丢给我一个代码层面的 CannotAcquireLockException的报错, 一脸无 ...

  3. Java 并发编程必须知道的七种锁类型以及应用

    锁是解决并发冲突的重要工具.在开发中我们会用到很多类型的锁,每种锁都有其自身的特点和适用范围. 需要深刻理解锁的理念和区别,才能正确.合理地使用锁. 常用锁类型 乐观锁与悲观锁 悲观锁对并发冲突持悲观 ...

  4. 浅谈MySQL的七种锁

    一.共享锁(S锁)/排他锁(X锁)     事务拿到某一行记录的共享S锁,才可以读取这一行,并阻止别的事物对其添加X锁     事务拿到某一行记录的排它X锁,才可以修改或者删除这一行     共享锁的 ...

  5. 七种方案!探讨Redis分布式锁的正确使用姿势

    前言 日常开发中,秒杀下单.抢红包等等业务场景,都需要用到分布式锁.而Redis非常适合作为分布式锁使用.本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式.如果有不正确的地方,欢迎大家 ...

  6. 数据事务四种隔离机制和七种传播行为

    数据事务四种隔离机制和七种传播行为 一.隔离级别: 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Seria ...

  7. MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...

  8. 【多线程】学习记录七种主线程等待子线程结束之后在执行的方法

    最近遇到一个问题需要主线程等待所有的子线程结束,才能开始执行,统计所有的子线程执行结果,返回,网上翻阅各种资料,最后记录一下,找到七种方案 第一种:while循环 对于"等待所有的子线程结束 ...

  9. 揭密Oracle之 七种武器

    揭密Oracle之 七种武器 第一章 搭建测试环境 vage 揭密Oracle之 七种武器  第一章 搭建测试环境 (揭密Oracle之七种武器第二章地址:DTrace语法:跟踪物理IO http:/ ...

最新文章

  1. 科学家打造全套人工神经系统 帮助瘫痪病人重新控制身体
  2. C 语言编程 — 数据类型转换
  3. BZOJ4567 SCOI2016背单词(trie+贪心)
  4. 取消对 null 指针“l”的引用。_C语言编程笔记丨C 语言指针 5 分钟教程
  5. 鼠标点计算机再点网络也是选定,鼠标左键单击变双击,点一下变两下是什么原因?...
  6. MySQL配置+SQLyog安装教程
  7. 开关稳压器工作原理与典型应用电路分析——LM2576、LM2596与LM2577
  8. 全国大学生电子设计竞赛(七)--逆变电源设计
  9. [爬虫系列(三)]用多线程爬取百度贴吧默认表情
  10. java实现xls转换为xlsx
  11. sql语句实现查询实例
  12. 体验魅力Cognos BI 10 系列,第1 部分: 第一次安装
  13. W10的AndroidStudio4.0.1的下载安装与配置
  14. android时间控制器,android UiAutomator长按实现控制按住控件时间的方法
  15. BH1750的一些使用心得(STM32,内置工程)
  16. MIPI RFFE协议使用不完全指南(附上代码详解和参考资料)第一部分
  17. MySQL语句的条件查询
  18. 什么是soft matting方法_NMS、 soft-nms、softer-nms
  19. 在k8s上安装Jenkins及常见问题
  20. 英语否定词语表达例析

热门文章

  1. 《GRACE: Gradient Harmonized and Cascaded Labeling for Aspect-based Sentiment Analysis》阅读笔记
  2. Latex基础命令入门
  3. windows驱动ddk环境设置
  4. JSTL【一】C标签的使用
  5. 基于SQLSERVER--数据库表的修复
  6. 量子计算机分解时间,量子计算机如何分解两个质数乘积
  7. 解决neural-renderer-pytorch编译安装问题
  8. MySQL数据库之设置密码修改密码用户名
  9. insmod: error inserting 'memdev.ko': -1 File exists
  10. RevitAPI: 修改视图View裁剪区域Cropbox的大小