InnoDB 数据库锁 (REPEATABLE-READ)

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

###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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖
  • 数据库

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

    343 引用 • 723 回帖 • 1 关注
  • 索引
    24 引用 • 28 回帖

相关帖子

欢迎来到这里!

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

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

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

  • V

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

  • sweat89

    学习学习···

  • 88250

    表格好迷幻

    1 回复
  • eddy 1
    作者

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

推荐标签 标签

  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 3 关注
  • danl
    148 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 213 关注
  • gRpc
    11 引用 • 9 回帖 • 73 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    178 引用 • 816 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 2 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 24 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖 • 1 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    412 引用 • 1246 回帖 • 587 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 77 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 526 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 369 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 314 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 561 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖
  • B3log

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

    1063 引用 • 3454 回帖 • 187 关注
  • 音乐

    你听到信仰的声音了么?

    61 引用 • 511 回帖 • 1 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 344 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 373 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 413 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • Flume

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

    9 引用 • 6 回帖 • 643 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 752 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 405 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    26 引用 • 196 回帖 • 18 关注