InnoDB 数据库锁 (REPEATABLE-READ)

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

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

    3203 引用 • 8217 回帖 • 1 关注
  • 数据库

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

    346 引用 • 761 回帖
  • 索引
    24 引用 • 28 回帖

相关帖子

欢迎来到这里!

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

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

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

  • V

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

  • sweat89

    学习学习···

  • 88250

    表格好迷幻

    1 回复
  • eddy 1
    作者

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

推荐标签 标签

  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 838 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 543 回帖 • 7 关注
  • 小说

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

    32 引用 • 108 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    26926 引用 • 112340 回帖 • 1 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 689 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 2 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 1 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 1 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 690 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 14 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    134 引用 • 1128 回帖 • 110 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 71 关注
  • H2

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

    11 引用 • 54 回帖 • 677 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 240 关注
  • 分享

    有什么新发现就分享给大家吧!

    249 引用 • 1799 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 9 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 836 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 616 关注
  • abitmean

    有点意思就行了

    38 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 662 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖 • 1 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 41 关注