前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >✅什么是排他锁、共享锁、意向锁

✅什么是排他锁、共享锁、意向锁

原创
作者头像
@派大星
发布2024-05-15 09:07:53
1040
发布2024-05-15 09:07:53
举报
文章被收录于专栏:码上遇见你码上遇见你

共享锁

共享锁,又被称为读锁,是由读取操作所创建的一种锁。在此期间,其他用户可以同时读取数据,但在数据上未释放所有共享锁之前,任何事务均无法对其进行修改(即获取数据的排他锁)。

一旦事务T对数据A加上共享锁,其他事务只能对A再加共享锁,而无法加排他锁。获得共享锁的事务仅可读取数据,不可修改数据。

代码语言:plsql
复制
SELECT ... LOCK IN SHARE MODE;

在查询语句后增加LOCK IN SHARE MODE,MySQL会对查询结果中的每一行都加上共享锁。当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁;否则会被阻塞。其他线程也可以读取已被共享锁保护的表,且这些线程读取的是同一版本的数据。

排他锁

排他锁又称为写锁。如果事务T对数据A加上排他锁,则其他事务无法对A加任何类型的锁。获得排他锁的事务既能读取数据,又能修改数据。

代码语言:plsql
复制
SELECT ... FOR UPDATE;

在查询语句后增加FOR UPDATE,MySQL会对查询结果中的每一行记录都加上排他锁。只有在没有其他线程对查询结果集中的任何一行使用排他锁时,才能成功申请排他锁;否则会被阻塞。

意向锁

在MySQL的InnoDB引擎中,支持多种锁级别,其中包括行级锁和表级锁。当多个事务需要访问同一共享资源时,如果每个事务都直接请求获取锁,可能会发生相互阻塞的情况,甚至可能导致死锁的产生。

举个例子:

假设事务A对表Table1中的某一行加上了行级锁,这使得该行记录只能被读取而不能被修改。同时,事务B试图对Table1增加表级锁。如果事务B成功获取了表级锁,那么它就可以修改表中的任意一行记录,这就导致了冲突。

为了解决这个问题,需要让事务B在尝试对Table1增加表级锁之前,先判断是否有其他事务已经对该表的某行加了行级锁。但是,事务B显然不能遍历整个表的数据逐条进行判断是否有加锁。

因此,MySQL引入了意向锁机制。意向锁是数据库管理系统中用于实现锁协议的一种机制,旨在处理不同锁粒度(如行锁和表锁)之间的并发性问题。这种机制帮助解决了不同锁粒度之间的并发问题,而对于相同锁粒度之间的并发问题,可以通过行级互斥锁来解决。

注意:

  1. 意向锁并非直接用于锁定资源,而是用于通知其他事务,以避免它们在资源上设置不兼容的锁。
  2. 意向锁并非由用户直接请求,而是由MySQL管理的。

当一个事务请求获取行级锁或表级锁时,MySQL会自动获取相应表的意向锁。这样,其他事务在请求获取表锁时,就可以首先基于这个意向锁来发现是否已经有其他事务加过锁,并根据该锁的类型(意向共享锁/意向排他锁)来判断自己是否可以获取锁。通过这种方式,可以在不阻塞其他事务的情况下,为当前事务锁定资源。意向锁有两种类型:意向共享锁和意向排他锁。

  1. 意向共享锁:表示事务打算在资源上设置共享锁(读锁)。通常用于表明事务计划读取资源,并希望在读取时不会有其他事务设置排他锁。
  2. 意向排他锁:表示事务打算在资源上设置排他锁(写锁)。这表示事务计划修改资源,并不希望有其他事务同时设置共享或排他锁。

意向锁是一种表级锁,在触发意向锁的事务提交或回滚后会被释放。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 共享锁
  • 排他锁
  • 意向锁
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档