前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >InnoDB中的意向锁,不与行级锁冲突的表级锁

InnoDB中的意向锁,不与行级锁冲突的表级锁

作者头像
田维常
发布于 2020-04-14 09:10:17
发布于 2020-04-14 09:10:17
2.8K00
代码可运行
举报
运行总次数:0
代码可运行

前言

InnoDB 支持多粒度锁(multiple granularity locking),它允许行级锁表级锁共存,而意向锁就是其中的一种表锁

意向锁(Intention Locks)

需要强调一下,意向锁是一种不与行级锁冲突的表级锁,这一点非常重要。意向锁分为两种:

  • 意向共享锁 (intention shared lock, IS):事务有意向对表中的某些行加 共享锁 (S锁) -- 事务要获取某些行的 S 锁,必须先获得表的 IS 锁。 SELECT column FROM table ... LOCK IN SHARE MODE;
  • 意向排他锁 (intention exclusive lock, IX):事务有意向对表中的某些行加 排他锁 (X锁) -- 事务要获取某些行的 X 锁,必须先获得表的 IX 锁。 SELECT column FROM table ... FOR UPDATE;

即:意向锁是有数据引擎自己维护的,用户无法手动操作意向锁,在为数据行加共享 / 排他锁之前,InooDB 会先获取该数据行所在在数据表的对应意向锁。

意向锁要解决的问题

我们先来看一下百度百科上对意向锁存在意义的描述:

如果另一个任务试图在该表级别上应用共享或排它锁,则受到由第一个任务控制的表级别意向锁的阻塞。第二个任务在锁定该表前不必检查各个页或行锁,而只需检查表上的意向锁。

设想这样一张 users 表:MySqlInnoDBRepeatable-Read:users(id PK,name)

事务 A 获取了某一行的排他锁,并未提交:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM users WHERE id = 6 FOR UPDATE;

事务 B 想要获取 users 表的表锁:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LOCK TABLES users READ;

因为共享锁与排他锁互斥,所以事务 B 在视图对 users 表加共享锁的时候,必须保证:

  • 当前没有其他事务持有 users 表的排他锁。
  • 当前没有其他事务持有 users 表中任意一行的排他锁 。

为了检测是否满足第二个条件,事务 B 必须在确保 users表不存在任何排他锁的前提下,去检测表中的每一行是否存在排他锁。很明显这是一个效率很差的做法,但是有了意向锁之后,情况就不一样了:

意向锁的兼容互斥性

意向锁是怎么解决这个问题的呢?首先,我们需要知道意向锁之间的兼容互斥性:

意向锁之间是互相兼容的,emmm......那你存在的意义是啥?

虽然意向锁和自家兄弟互相兼容,但是它会与普通的排他 / 共享锁互斥:

注意:这里的排他 / 共享锁指的都是表锁!!!意向锁不会与行级的共享 / 排他锁互斥!!!

现在我们回到刚才 users 表的例子:

事务 A 获取了某一行的排他锁,并未提交:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM users WHERE id = 6 FOR UPDATE;

此时 users 表存在两把锁:users 表上的意向排他锁与 id 为 6 的数据行上的排他锁

事务 B 想要获取 users 表的共享锁:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LOCK TABLES users READ;

此时事务 B 检测事务 A 持有 users 表的意向排他锁,就可以得知事务 A 必然持有该表中某些数据行的排他锁,那么事务 Busers 表的加锁请求就会被排斥(阻塞),而无需去检测表中的每一行数据是否存在排他锁。

意向锁的并发性

这就牵扯到我前面多次强调的一件事情:

意向锁不会与行级的共享 / 排他锁互斥!!!意向锁不会与行级的共享 / 排他锁互斥!!!意向锁不会与行级的共享 / 排他锁互斥!!!

重要的话要加粗说三遍,正因为如此,意向锁并不会影响到多个事务对不同数据行加排他锁时的并发性(不然我们直接用普通的表锁就行了)。

最后我们扩展一下上面 users 表的例子来概括一下意向锁的作用(一条数据从被锁定到被释放的过程中,可能存在多种不同锁,但是这里我们只着重表现意向锁):

事务 A 先获取了某一行的排他锁,并未提交:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM users WHERE id = 6 FOR UPDATE;
  1. 事务 A 获取了 users 表上的意向排他锁
  2. 事务 A 获取了 id 为 6 的数据行上的排他锁

之后事务 B 想要获取 users 表的共享锁

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LOCK TABLES users READ;
  1. 事务 B 检测到事务 A 持有 users 表的意向排他锁
  2. 事务 Busers 表的加锁请求被阻塞(排斥)。

最后事务 C 也想获取 users 表中某一行的排他锁

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM users WHERE id = 5 FOR UPDATE;
  1. 事务 C 申请 users 表的意向排他锁
  2. 事务 C 检测到事务 A 持有 users 表的意向排他锁
  3. 因为意向锁之间并不互斥,所以事务 C 获取到了 users 表的意向排他锁
  4. 因为id 为 5 的数据行上不存在任何排他锁,最终事务 C 成功获取到了该数据行上的排他锁

总结

  1. InnoDB 支持多粒度锁,特定场景下,行级锁可以与表级锁共存。
  2. 意向锁之间互不排斥,但除了 IS 与 S 兼容外,意向锁会与 共享锁 / 排他锁 互斥
  3. IX,IS是表级锁,不会和行级的X,S锁发生冲突。只会和表级的X,S发生冲突。
  4. 意向锁在保证并发性的前提下,实现了行锁和表锁共存满足事务隔离性的要求。

来源:Gtaker

https://juejin.im/post/5b85124f5188253010326360

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
企业云迁移全攻略:成功迁移的几大关键步骤及注意事项
在当今这个数据驱动的时代,企业比以往任何时候都能访问更多的数据。这些数据不仅数量庞大,而且变化速度惊人。无论是采用传统的数据分析方法还是利用机器学习和人工智能等前沿技术,将来自各个来源的信息集中到云存储库中对于业务来说至关重要。
ICT系统集成阿祥
2025/01/10
1530
企业云迁移全攻略:成功迁移的几大关键步骤及注意事项
进行大规模云迁移的挑战和建议
云迁移的过程非常复杂,需要适当的计划和执行。可以肯定的是,很多企业在迁移过程中将面临意想不到的挑战。为了缓解一些挑战,企业可以通过云计算提供商的合作伙伴生态系统或云计算提供商提供的专业服务寻求帮助。
静一
2020/12/02
6260
关于云迁移,企业需要了解的事
当企业计划将业务迁移到云平台时,需要了解云计算迁移的模式列表,了解其可以做什么以及应该避免什么,这将有助于企业做出明智的决定。
静一
2020/05/19
5360
关于云迁移,企业需要了解的事
如何优化云计算投资
关注组织的目标可以确保支出、连接性和安全性保持在可控制的范围内,并与组织的IT愿景保持一致。成本优化的云平台将利用所有资源并以更低成本实现目标,从而使组织能够专注于其他IT优先事项。
静一
2020/06/17
9070
成功进行云计算迁移的八个步骤
在调查中,90%的企业表示难以迁移到云中,复杂性是最常被引用的问题,可以肯定的是,转移物理系统是很多问题的根源。它们通常是传统IT战略的最后一个遗留问题,因为它们支撑着业务运营。 根据调查,英国企业的云采用率现在已接近90%,并且不久之后,所有组织都将在一定程度上从云计算的灵活性、效率和成本节约中受益。经过第一次采用的浪潮,人们看到企业增加了他们迁移到云中的工作负载和应用程序的复杂性。 也许这也是90%的公司在云迁移项目中遇到困难的原因。这对IT团队在部署云解决方案时感到沮丧,因为按理说,
静一
2018/06/08
1.8K0
实施云迁移之前如何计算成本
计算云迁移成本的第一步是在企业将工作负载迁移到云平台之前开始。数据中心管理人员需要评估现有硬件和软件资产的成本,然后评估其与云平台环境的比较方式。在估计了内部部署环境的成本之后,企业可以计算计划构建的云计算环境的成本,并将两者进行比较。计算云计算成本的最佳方法是使用为这一目的而设计的计算器工具。所有主要的云供应商都有自己的计算器。
静一
2021/06/01
9880
将Oracle企业应用程序迁移到云端需要了解的信息
云计算、公共云、多云……人们几乎每天都能听到有关云计算的新闻。事实上,它已成为企业获得敏锐信息技术的推动力。作为Oracle应用程序用户,云计算是企业战略的一部分吗?企业是否考虑将其电子商务套件、Pe
静一
2019/07/05
7530
将Oracle企业应用程序迁移到云端需要了解的信息
云容量管理和应用
几十年来,容量管理一直用于优化组织内部资源。现在,随着IT逐步转向云环境,这种方法正在被扩展,以便在同一个地方和同一时间实现所有资源(包括云计算和本地部署)的整体规划、管理和优化。
静一
2019/03/07
3.2K0
云容量管理和应用
有效的云迁移策略为企业带来的六大好处
实现内部部署设施到多云之间的数据迁移将加快创新速度,将业务人员从运营工作中解放出来,并在混合云和多云部署环境之间构建一座桥梁。
静一
2022/04/02
5510
为什么云中有那么多企业遭遇安全漏洞?
现在企业的网络安全现状不乐观,如果企业对此无动于衷,他们将有一半的机会成为下一个被攻击的目标。如果企业的云计算资产配置不正确、不进行持续监控和更新,那么业务可能会受到攻击。本文介绍了企业确保云资产安全的五个提示。
静一
2022/09/02
3040
企业在云迁移之后面临的5大挑战
如今,企业将业务迁移到云平台的好处已得到充分证明:提高了效率、可扩展性、业务敏捷性,简化管理,并降低总体成本。将业务迁移到云平台中可以推动企业的数字化转型,并使他们能够更快地适应新技术,这项功能对于当今快速发展的业务格局至关重要。
CloudBest
2019/12/06
1K0
企业在云迁移之后面临的5大挑战
企业将如何迁移到云平台?
考虑到新冠病毒疫情导致资金紧缩,云迁移正越来越多地受到企业财务主管的推动,他们希望从资本支出转向运营支出。
静一
2020/11/19
1.6K0
如何正确进行云迁移
对于许多企业来说,如何更好地将关键业务数据和元数据迁移到云端以支持持续的运营和分析仍然是一个难题。要充分利用现代数据堆栈,需要清楚地了解迁移到云端的用例以及成功所需的数据。
静一
2022/12/08
8250
云迁移可能失败的5种方式以及成功的5种方式
对于大多数企业而言,将业务迁移到云平台不再是一个难题。通过将应用程序迁移到云平台中,企业可以提高安全性、数据访问、可扩展性和IT灵活性。将业务迁移到云平台还可以为企业节省成本。
静一
2019/11/22
8940
混合云:如何在公有云和私有云的结合中保持平衡
在混合云世界中,人们将会发现公共云和私有云混合部署的优势:企业需要对某些数据和应用程序进行内部控制,以及为其他业务提供公共云的可扩展性。IT人员需要花费时间查看业务的整体解决方案,并遵循最佳实践帮助企业充分利用这一环境,同时在预算、安全、合规性和优化方面取得更大进展。
静一
2019/08/09
2.1K0
为什么会发生云迁移故障以及如何预防
企业如今向云平台迁移的应用程序比以往任何时候都要多,但其中的许多计划都失败了。企业应该学习如何避免在云迁移方面犯错。
静一
2020/02/26
7830
为什么多云战略对于企业数据保护至关重要
RightScale公司还进行了一项调查,结果发现企业正在考虑并逐步增加对多个公共云平台的使用,而不是只与一家云计算提供商合作。ESG公司2017年开展的调查报告证实了这些发现,81%的组织报告了多云战略和实施计划。
静一
2018/12/19
3730
为什么多云战略对于企业数据保护至关重要
成功进行云迁移的方法
已经开始进行云计算之旅的组织已经展现出对于应对疫情的更大弹性和响应能力。预计在不久的将来,随着不同的云服务模型(SaaS、PaaS、IaaS)以及混合云和多云拓扑的结合,预计各行业组织的云计算采用率将显著提高。
静一
2021/02/05
1.2K0
成功进行云迁移的方法
有效实现多云成本管理的8个步骤
众所周知,企业采用多云可以节省成本,并提高生产力。但是多云基础设施很复杂,具有多家云计算供应商提供的不同服务和条款。企业在采用多个云平台时,很容易在自己没有意识到的情况下造成资金的浪费。
静一
2018/12/18
6480
有效实现多云成本管理的8个步骤
迁移到云端的企业为数字化转型做好准备了吗?
如今,很多企业的首席信息官都在考虑数字化转型,一些技术决策者正寻求将业务迁移到云端,其原因有很多,例如,认为大型机过时的观念、降低成本,以及提高生产力。
静一
2019/05/08
6220
迁移到云端的企业为数字化转型做好准备了吗?
推荐阅读
相关推荐
企业云迁移全攻略:成功迁移的几大关键步骤及注意事项
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验