InnoDB 数据库锁 (REPEATABLE-READ)

本贴最后更新于 3001 天前,其中的信息可能已经时移世改

###InnoDB 加锁方式(REPEATABLE-READ)

共享锁:允许事物读取数据,阻止其它事物获取该数据集的排他锁
排他锁:允许获取锁的事物更新数据集,阻止其它事物获取数据集的共享		锁和排他锁。

根据锁定数据集的大小,mysql 的排他分为表锁和行锁

  1. 表锁,锁定整个表
  2. 行锁,锁定一个数据子集

在 InnoDB,行锁是通过给索引上的索引项加锁来实现的,也就是说,只有通过索引条件检索数据,才能使用行锁,否则会使用表锁。


表锁:
无索引

session1 session2
set autocommit = false
update lock_test set fkey = 'A' where c = 1
Rows matched: 2 Changed: 2 Warnings: 0
update lock_test set fkey = 'C' where c = 2
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

行锁:

  • 对字段 c 加普通索引
session1 session2
set autocommit = false
update lock_test set fkey = 'A' where c = 1
Rows matched: 2 Changed: 2 Warnings: 0
update lock_test set fkey = 'C' where c = 2
Rows matched: 2 Changed: 2 Warnings: 0

使用主键索引、唯一索引或普通索引,InnoDB 都会使用行锁来对数据加锁。


  • 对字段 C 加普通索引
session1 session2
set autocommit = false
update lock_test set fkey = 'A' where c = 1 and fkey = 'D'
Rows matched: 1 Changed: 1 Warnings: 0
update lock_test set fkey = 'C' where c = 2 and fkey = 'M'
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

InnoDB 对索引项加锁,尽管更新两条不同的数据,但使用相同的索引项


注意:

  • 不是使用了索引字段过滤就会使用行级锁,需要 explain 看下 mysql 具体的执行计划
  • InnoDB 行级锁是对索引项加锁,即
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 UPDATE lock_test NULL range idx_lock idx_lock 8 const 2 100.00 Using where; Using temporary

rows 对应的数据写操作均会被锁定

###间隙锁

  • 当使用范围查询时,InnoDB 不仅会对存在的数据加锁,也会对不存在的空隙加锁,即间隙锁(max(id)=10 | where id > 9 | 对 10 加锁 | 对 >10 空隙加锁)

  • 这种加锁的目的是为了防止幻读, 防治写操作过程中出现其它 session 提交了 id > 10 的数据。

间隙锁:

  • 对不存在的索引间隙添加锁,阻止对该间隙的修改.
session1 session2
set autocommit = false
update lock_test set fkey = 'A' where c < 6
Rows matched: 1 Changed: 1 Warnings: 0
insert into lock_test(c, fkey) values (2, 'T');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
session1 session2
set autocommit = false
update lock_test set fkey = 'A' where c < 6
Rows matched: 1 Changed: 1 Warnings: 0
update lock_test set fkey = 'A' where id = 2; 注释:存在一条 id = 2 and c = 3 的数据
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
session1 session2
set autocommit = false
update lock_test set fkey = 'A' where c < 6
Rows matched: 1 Changed: 1 Warnings: 0
insert into lock_test(c, fkey) values (7, 'CA');
Rows matched: 1 Changed: 1 Warnings: 0
  • 当 update 过滤条件为范围查询并且使用普通索引时,会对普通索引不存在部分添加间隙锁,主键索引数据添加排他锁。
  • 当 update 过滤条件为范围查询并且使用主键索引时,会对主键索引添加间隙锁。
  • 当执行 insert 时,会同时对普通索引以及主键添加间隙锁

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    342 引用 • 708 回帖
  • 索引
    24 引用 • 28 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • meikaiyipian

    沙发
    多谢楼主分享,mark 一下
    @V 前排带上小薇

  • V

    嘘....我正在思考人生

  • sweat89

    学习学习···

  • 88250

    表格好迷幻

    1 回复
  • eddy 1
    作者

    主要是想模拟两个会话不同的执行顺序

推荐标签 标签

  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 65 回帖 • 439 关注
  • 倾城之链
    23 引用 • 66 回帖 • 138 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 619 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 2 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 28 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖 • 2 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    568 引用 • 3532 回帖
  • V2Ray
    1 引用 • 15 回帖 • 2 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖 • 2 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    133 引用 • 189 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 374 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 632 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖 • 1 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 156 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 537 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 101 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 653 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 585 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8131 引用 • 37068 回帖 • 160 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 64 关注
  • gRpc
    11 引用 • 9 回帖 • 74 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖 • 1 关注