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

数据库 MySQL
在MySQL的InnoDB引擎中,支持多种锁级别,其中包括行级锁和表级锁,而共享锁,又被称为读锁,是由读取操作所创建的一种锁。

共享锁

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

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

SELECT ... LOCK IN SHARE MODE;

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

排他锁

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

SELECT ... FOR UPDATE;

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

意向锁

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

举个例子:

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

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

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

注意:

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

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

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

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

责任编辑:赵宁宁 来源: 码上遇见你
相关推荐

2023-07-03 08:15:46

MySQLInnoDB

2022-11-28 14:27:17

插入意向锁age

2023-12-28 17:33:25

意向锁MySQL开发者

2022-04-21 10:39:29

InnoDB意向锁SQL

2024-10-30 10:38:08

2019-01-04 11:18:35

独享锁共享锁非公平锁

2024-03-04 07:37:40

MySQL记录锁

2018-07-31 10:10:06

MySQLInnoDB死锁

2022-07-20 08:06:57

MySQL表锁Innodb

2019-11-28 16:00:06

重入锁读写锁乐观锁

2024-05-15 09:41:22

乐观锁编程

2022-02-21 15:01:45

MySQL共享锁独占锁

2017-08-30 18:15:54

MySql

2024-01-29 01:08:01

悲观锁递归锁读写锁

2021-06-11 16:59:41

MySQLRepeatableRead

2024-01-29 07:43:42

Java独占锁共享锁

2024-06-06 09:03:37

MySQL数据库共享锁

2022-12-27 17:40:57

意向锁MySQLInnoDB

2024-06-11 00:01:00

并发validate场景

2024-03-04 00:01:00

锁表锁行MySQL
点赞
收藏

51CTO技术栈公众号