首页 > 其他分享 >意向共享锁与意向排它锁:详解与应用

意向共享锁与意向排它锁:详解与应用

时间:2024-08-19 15:16:07浏览次数:6  
标签:事务 goods 详解 意向锁 排它 共享 意向

在数据库系统中,锁机制是保证数据一致性和完整性的关键。除了行级锁和表级锁外,还有一种锁类型,它在数据库的事务处理中扮演着重要的角色——意向锁(Intention Locks)。在这篇博客中,我们将详细讲解意向共享锁(Intention Shared Lock)和意向排它锁(Intention Exclusive Lock)的概念、作用及其应用。

什么是意向锁?

意向锁是一种特殊的锁类型,主要用于表级别的锁管理,它的存在目的是为了避免在行级锁和表级锁之间发生冲突。意向锁不会直接锁定数据行,而是标记表中的某个数据行在未来可能会被锁定的意图。这种锁帮助数据库系统高效地管理并发事务,减少锁冲突,提高性能。

意向锁是表锁,为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。

当有事务A有行锁时,MySQL会自动为该表添加意向锁,事务B如果想申请整个表的写锁,那么不需要遍历每一行判断是否存在行锁,而直接判断是否存在意向锁,增强性能。

意向共享锁(Intention Shared Lock)

定义:意向共享锁(IS锁)用于表示事务计划在未来对某些行加共享锁。它的存在表明事务对表中的行有意向加共享锁,从而确保其他事务不会在表级别上加排他锁。

方式:自动添加,添加共享锁的时候自动加上意向共享锁

作用

  • 锁管理:通过在表上加意向共享锁,数据库可以有效地协调对行级共享锁的请求,避免了事务直接竞争行级锁的问题。
  • 避免冲突:意向共享锁的存在表明事务将要对表中的某些行加共享锁,其他事务可以避免对表级别的排他锁进行操作。

示例: 假设有两个事务:事务A希望对表中的某些行加共享锁,而事务B希望对整个表加排他锁。为了防止冲突,事务A会首先在表上加意向共享锁,事务B在尝试获取表级排他锁时,会检查表上是否有意向共享锁,以决定是否可以获取锁。

START TRANSACTION;

-- 事务A请求意向共享锁
SELECT * FROM products WHERE product_id = 1 LOCK IN SHARE MODE;

-- 事务B尝试获取排他锁
-- 事务B会检查表上是否存在意向共享锁,如果存在,可能会等待或回滚
LOCK TABLES products WRITE;

COMMIT;

意向排它锁(Intention Exclusive Lock)

定义:意向排它锁(IX锁)用于表示事务计划在未来对某些行加排他锁。它的存在表明事务对表中的行有意向加排他锁,从而阻止其他事务对这些行加共享锁或排他锁。

作用

  • 锁管理:通过在表上加意向排它锁,数据库可以有效地协调对行级排他锁的请求,避免了事务直接竞争行级锁的问题。
  • 避免冲突:意向排它锁的存在表明事务将要对表中的某些行加排他锁,其他事务可以避免对表级别的共享锁进行操作。

方式:自动添加,添加排它锁的时候自动加上意向排它锁

示例: 假设有两个事务:事务A希望对表中的某些行加排他锁,而事务B希望对整个表加共享锁。为了防止冲突,事务A会首先在表上加意向排它锁,事务B在尝试获取表级共享锁时,会检查表上是否有意向排它锁,以决定是否可以获取锁。

START TRANSACTION;

-- 事务A请求意向排它锁
SELECT * FROM products WHERE product_id = 1 FOR UPDATE;

-- 事务B尝试获取共享锁
-- 事务B会检查表上是否存在意向排它锁,如果存在,可能会等待或回滚
LOCK TABLES products READ;

COMMIT;

意向锁的作用

  1. 优化锁管理:意向锁帮助数据库系统高效地管理锁定请求,减少锁冲突和死锁的可能性。
  2. 提高并发性:通过在表级别和行级别使用意向锁,数据库系统能够更好地处理并发事务,提高并发性能。
  3. 减少锁竞争:意向锁减少了事务在尝试获取锁时的直接竞争,允许事务在表级别和行级别之间有序地进行锁定。

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

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

select*from goods where id=1 for update;

  此时 goods 表存在两把锁:goods 表上的意向排它锁与 id 为 1 的数据行上的排它锁。

  session2 想要获取 goods 表的共享锁:

LOCK TABLES goods READ;

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

  

  

总结

意向共享锁和意向排它锁是数据库锁机制中的重要组成部分。它们通过在表级别标记事务的锁定意图,帮助数据库系统更有效地管理并发事务,减少锁冲突,提高性能。理解意向锁的概念和应用场景,有助于更好地设计和优化数据库事务处理策略,从而提高数据库系统的并发能力和数据一致性。

标签:事务,goods,详解,意向锁,排它,共享,意向
From: https://www.cnblogs.com/zhanchenjin/p/18367358

相关文章

  • MYSQL排它锁获取机制
    在数据库系统中,排他锁(ExclusiveLock)用于确保在一个事务对数据进行修改时,其他事务无法访问或修改相同的数据。这种机制确保了数据的完整性和一致性。获取排他锁的方式包括自动获取和手动获取,下面我将详细整理这两种方式的机制。自动获取排他锁行级别的排他锁(自动)场景:当你执......
  • MySQL 排他锁之表级锁:使用与实例详解
    在数据库系统中,锁机制是确保数据一致性、完整性的重要手段。MySQL中的排他锁(ExclusiveLock)是防止数据在修改过程中被其他事务访问或修改的关键工具。排他锁不仅可以作用于单行数据,还可以作用于整个表。当排他锁用于表级别时,它可以阻止其他事务对表的任何操作,从而确保数据的一致性......
  • MySQL 排他锁之行级锁:使用与实例详解
    在MySQL中,排他锁(ExclusiveLock),也称为写锁(WriteLock),是确保数据一致性的重要工具。当一个事务对某行数据加上排他锁时,其他事务既不能读取也不能修改该数据。这种锁通常在进行更新或删除操作时自动应用,以防止数据冲突。本文将通过具体实例来展示排他锁的使用方法。1.什么是排他锁......
  • MySQL 共享锁之表级锁:使用与实例详解
    在数据库管理中,锁机制是确保数据一致性与完整性的关键工具之一。MySQL中的共享锁(SharedLock)是一种允许多个事务并发读取数据但禁止修改的锁类型。共享锁不仅可以作用于单行数据,还可以作用于整个表。当共享锁用于表级别时,它能有效防止数据在读取期间被修改,从而确保数据的一致性。......
  • MySQL共享锁:使用与实例详解
    在关系型数据库的使用中,锁机制是保障数据一致性和完整性的关键工具。尤其在并发环境下,合理使用锁可以有效避免数据冲突与不一致问题。本文将详细介绍MySQL中的共享锁(SharedLock),并通过实际案例展示其具体应用场景。1.什么是共享锁(SharedLock)?共享锁,也称为读锁(ReadLock),是MySQL......
  • 学懂C++(三十七):深入详解C++网络编程开发
            目录一、网络编程基础概念与原理1.1套接字(Socket)1.2IP地址和端口1.3TCP/IP协议二、C++网络编程核心技术2.1套接字编程2.1.1创建套接字2.1.2绑定地址2.1.3监听和接受连接2.1.4发送和接收数据三、C++网络编程高级技术3.1异步I/O3.2多线......
  • 学懂C++(三十八):深入详解C++网络编程:套接字(Socket)开发技术
    目录一、概述与基础概念1.1套接字(Socket)概念1.2底层原理与网络协议1.2.1网络协议1.2.2套接字工作原理二、C++套接字编程核心技术2.1套接字编程的基本步骤2.2套接字编程详细实现2.2.1创建套接字2.2.2绑定地址2.2.3监听和接受连接(服务端)2.2.4客户端连接2.......
  • 全面指南:LLMs中的Llama-3模型——简介、安装教程、使用技巧及案例实践详解
    LLMs之Llama3:Llama-3的简介、安装和使用方法、案例应用之详细攻略导读:2024年4月18日,Meta重磅推出了MetaLlama3,本文章主要介绍了Meta推出的新的开源大语言模型MetaLlama3。模型架构Llama3是一种自回归语言模型,采用了优化的Transformer架构。调优版本使用了监督......
  • 软启动详解
    软启动详解软启动(SoftStart)是一种用于电机或电气负载的启动技术,旨在减少启动时的电流冲击和机械应力。通过软启动,设备可以在启动过程中逐渐增加功率,从而实现平滑启动。以下是软启动的详细介绍:软启动的目的减少启动电流:避免因电流过大而损坏电机或电网。减少机械应力:平滑启动......
  • 【Three.JS零基础入门教程】第八篇:材质详解
     前期回顾:【Three.JS零基础入门教程】第一篇:搭建开发环境【Three.JS零基础入门教程】第二篇:起步案例【Three.JS零基础入门教程】第三篇:开发辅助【Three.JS零基础入门教程】第四篇:基础变换【Three.JS零基础入门教程】第五篇:项目规划【Three.JS零基础入门教程】第六篇:物体......