MySQL 中的共享锁、排他锁与意向锁

2023-11-09

共享锁(Share Lock)

共享锁又称读锁,简称 S 锁:一个事务获取了一个数据行的共享锁,其他事务能获得该行对应的共享锁,但不能获得排他锁,即一个事务在读取一个数据行的时候,其他事务可以并发读取数据,但不能对该数据行进行增删改,直到已释放所有共享锁

如果事务 T 对数据 A 加上共享锁后,则其他事务只能对 A 再加共享锁,不能加排他锁。获取共享锁的事务只能读数据,不能修改数据

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

排他锁(eXclusive Lock)

排他锁又称写锁,简称 X 锁:一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁(排他锁或者共享锁),即一个事务在读取一个数据行的时候,其他事务不能对该数据行进行增删改查

如果事务 T 对数据 A 加上排他锁后,则其他事务不能再对 A 加任何类型的封锁。获取排他锁的事务既能读数据,又能修改数据

在查询语句后面增加FOR UPDATE,MySQL 会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞

意向锁

意向锁是表级锁,其设计目的主要是为了在一个事务中揭示下一行将要被请求锁的类型。InnoDB 中的两个表锁:

意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的 IS 锁。如果需要对记录 A 加共享锁,那么此时 InnoDB 会先找到这张表,对该表加意向共享锁之后,再对记录 A 添加共享锁

意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,也就是说事务在给一个数据行加排他锁前必须先取得该表的 IX 锁。如果需要对记录 A 加排他锁,那么此时 InnoDB 会先找到这张表,对该表加意向排他锁之后,再对记录 A 添加排他锁

意向锁是 InnoDB 自动加的,不需要用户干预

注意点

  • 对于 insert、update、delete,InnoDB 会自动给涉及的数据加排他锁(X),只有查询 select 需要我们手动设置排他锁
  • 对于一般的 select 语句,InnoDB 不会加任何锁,也就是可以多个并发去进行 select 的操作,不会有任何的锁冲突,因为根本没有锁

如何设置共享锁和排他锁?
共享锁:SELECT ... LOCK IN SHARE MODE;
排他锁:SELECT ... FOR UPDATE;

总结

  • 共享锁和排他锁,系统在特定的条件下会自动添加共享锁或者排他锁,也可以手动添加共享锁或者排他锁。
    意向共享锁和意向排他锁都是系统自动添加和自动释放的,整个过程无需人工干预

  • 共享锁和排他锁都是锁的行记录,意向共享锁和意向排他锁锁定的是表

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 中的共享锁、排他锁与意向锁 的相关文章

  • 如何在不超时的情况下解析大型 CSV 文件?

    我正在尝试解析 50 MB 的 csv 文件 文件本身很好 但我正在尝试解决所涉及的大量超时问题 每个设置上传明智 我可以轻松上传并重新打开文件 但浏览器超时后 我收到 500 内部错误 我的猜测是我可以将文件保存到服务器上 打开它并保留我
  • Mysql - Mysql2::错误:字符串值不正确:

    所以我建造了一个刮刀并拉动一些物体 问题是有些是外语 它使 mysql 数据库有点崩溃 这是我得到的错误 知道我能用这个做什么吗 谢谢 Mysql2 错误 列的字符串值不正确 xC5 x8Dga 第 1 行的 描述 插入sammiches
  • SQL统计高于和低于平均分的学生人数

    我在下面有一个示例表 我试图获取高于平均分数的学生人数和低于平均分数的学生人数 name subject classroom classarm session first term score first term grade std1 m
  • MySQL用户创建的临时表已满

    我使用内存引擎创建了一个临时表 如下所示 CREATE TEMPORARY TABLE IF NOT EXISTS some text id INT DEFAULT 0 string varchar 400 DEFAULT engine m
  • MYSQL中收盘价的简单移动平均线计算和更新表

    我可以使用一些帮助 最好是虚拟指南 来更新下表 CREATE TABLE SYMBOL day date NOT NULL open decimal 8 3 DEFAULT NULL high decimal 8 3 DEFAULT NUL
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • Codeigniter 加入多个条件

    我正在使用 Codeigniter Active Records 课程 我想加入我的users与我的桌子clients表 这样我就可以显示用户的 真实 姓名 而不仅仅是他们的 ID 这是什么clients表看起来像 示例 列 a 1 a 2
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • 在docker中使用MySQL数据库设置aspnetcore

    我正在尝试设置一个 docker compose 文件 其中包含 asp net core mysql 数据库和 phpmyadmin 的容器 设置我的 mysql 服务器没有问题 我可以使用 phpmyadmin 访问它 我的 asp n
  • 通过连接从两个表中删除?

    我有两个表如下 tbl1 tbl2 id article id title image whole news tags author older datetime 其中 tbl1 id gt tbl2 article id 如何从两个表中删
  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • 使用按位函数查询 BIT 字段时,MySQL 不使用索引

    我的 MySQL 表中有一个 BIT 类型的字段 我想使用位值存储记录的状态 例如 1 status1 2 status2 4 status3 8 status4 每条记录可以同时具有多种状态 对于 status1 和 status3 该值
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • ActiveRecord3死锁重试

    Rails 3 或 ActiveRecord 3 是否有任何插件可以复制旧版本死锁重试 http agilewebdevelopment com plugins deadlock retry插入 或者 该插件仍然适用于 Rails 3 吗
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w
  • 为什么我的 if 语句没有按我预期的方式工作?

    我正在尝试实现以下目标 我向我的 SQL 数据库询问使用SELECT FROM subjects 这样做之后我要求使用数组mysqli fetch assoc 在那之前一切都很好 现在的问题是 当我尝试在每个循环中修改 genero 的值
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超

随机推荐

  • 通过几个例子看sed的模式空间与保持空间

    http blog chinaunix net uid 7530389 id 2050047 html SED之所以能以行为单位的编辑或修改文本 其原因在于它使用了两个空间 一个是活动的 模式空间 pattern space 另一个是起辅助
  • 干货!最新综述带你全面了解ChatGPT,AIGC和扩散模型:底层原理、技术路线、应用场景......

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 2022年 ChatGPT的成功发布引起了全球科技圈的轰动 而它的成熟应用也成为了AIGC时代到来的标志 目前 AIGC已经以超乎人们预期的速度迅速催生了全新的科技系统与产业格局
  • centos7.2环境下使用rpm命令安装gcc

    我们安装gcc可以采用rpm包来安装 获取rpm包可以通过镜像的模式 具体指南可以参考Linux通过磁盘挂载来安装包 Xlucas的博客 CSDN博客 1 安装gcc需要用到的包有如下这些 所以我们需要创建一个路径 将这些包拷贝到指定对应路
  • IntelliJ IDEA找不到单元测试代码覆盖率默认工具,没有Coverage选项卡

    1 我们使用Java开发工具IntelliJ IDEA 有时候使用单元测试工具Junit后 要进行代码覆盖率报告输出 可使用IDEA自带的代码覆盖率工具 直接测试类名右键Run MyClassTest with Coverage或工具栏上的
  • AWK Linux文本分析工具

    AWK Linux文本分析工具 AWK是一种速度较快 功能齐全的文本分析工具 可以用来读取输入文件 为数据排序 处理数据 对输入执行计算以及生成报表 实际上 AWK 的确拥有自己的语言 AWK 程序设计语言 允许我们创建简短的程序完成对文本
  • 【微信公众号】JS-SDK页面打开提示realAuthUrl错误

    测试环境好好地功能 上了生产 莫名其妙报错 开始以为是没有设置Js安全接口域名 结果让相应人员一查 已经设置了相应的域名 再看下公众号内的接口权限部分 相关js权限也都是已授权 没办法 只能按照微信文档上的常见错误及解决方法 设置debug
  • 定义一个雇员类Employee,包括属性:姓名,工号,年龄,工资。

    1 定义一个雇员类Employee 包括属性 姓名 工号 年龄 工资 要求 工号的构成方式 入职年月份 性别 3位随机序列码 其中入职年月份格式为yyyyMMdd 性别 枚举 为男记录00 性别为女记录01 随机号码长3 且不能全0或全1
  • opencv python debug记录

    本文将持续记录opencv python使用过程中出现的常见错误和解决方案 1 window cpp 1274 error 2 Unspecified error The function is not implemented 该错误通常表
  • 手机屏幕常见故障_触屏不灵敏、断触怎么回事?手机触摸屏的基本原理与常见问题排查方法介绍...

    手机触摸屏断触是怎么回事 大家在日常使用中可能会碰到各种各样的触摸屏问题 类似 断触 滑动屏幕不跟手 输入法打字不灵敏 游戏中多点触摸不灵敏 等问题 下面咱们从利用排除法来进行排查定位 想要弄清手机触屏这一块断触是怎么回事的小伙伴千万不要错
  • Cefsharp中清除缓存,cookie和浏览器数据

    Cefsharp在wpf中清除缓存 cookie和浏览器数据 我正在开发一个使用cefsharp浏览器作为其一部分的银行设备上的应用程序 因为这个应用程序将被任何人使用 它不应该保存下一个用户可以看到的来自先前用户的任何数据 我想在关闭后清
  • Java实现短信验证码功能(利用容联云,个人测试,不需要项目上线)

    前提 开发环境 jdk1 8 idea2020 准备工作 1 登录容联云官网https www yuntongxun com 2 按照提示注册一个容联云账号 3 注册完成点击控制台如下页面 需要记住 ACCOUNT SID AUTH TOK
  • android boot.img 拆包,修改adb 具有root权限,以i9250为例

    Android 系统的rom最主要的就是3个文件 boot img system img userdata img 其中boot img 存放着内核以及Android系统的配置信息 比如android系统各文件夹的读写权限 adb 的权限
  • 个人学习笔记(二)

    在安装 ahocorasick库是碰到了许多问题 首先是安装好anaconda 配置好Python环境后输入conda install pyahocorasick报错 如图 然后尝试用pip install pyahocorasick 也出
  • java httpclient的digest验证(可恨,找遍全网没有靠谱的,不是少包就是少文件。含泪整理o(╥﹏╥)o~~~~)

    背景 调用第三方接口 使用的是digest auth鉴权方式 basic auth和digest auth比较 basic认证是把用户和密码通过base64加密后发送给服务器进行验证 Basic认证过程简单 每次请求都有发送密码 安全性较低
  • 变量那些事

    什么是变量 变数或变量 是指没有固定的值 可以改变的数 变量以非数字的符号来表达 一般用拉丁字母 变量是常数的相反 变量的用处在于能一般化描述指令的方式 结果只能使用真实的值 指令只能应用于某些情况下 变量能够作为某特定种类的值中任何一个的
  • 开心档-软件开发入门之MongoDB 创建集合

    作者简介 每天分享的MongoDB 创建集合学习经验 和学习笔记 座右铭 有自制力 做事有始有终 学习能力强 愿意不断地接触学习新知识 个人主页 iOS开发上架的主页 前言 本章将会讲解MongoDB 创建集合 目录 MongoDB 创建集
  • 电子设计竞赛(4)-常用的两种PID算法

    公众号关注 大鱼机器人 设为 星标 重磅干货 第一时间送达 1 什么是PID PID 控制器以各种形式使用超过了 1 世纪 广泛应用在机械设备 气动设备 和电子设备 在工业应用中PID及其衍生算法是应用最广泛的算法之一 是当之无愧的万能算法
  • 爬虫工作中代理失效了怎么处理?

    Hey 亲爱的爬虫小伙伴们 是不是经常在爬虫的工作中遇到代理IP失效的问题 别着急 今天我来分享一些应对代理失效的妙招 这些方法简单易行 让你爬虫顺利进行 一 为什么代理会失效 在爬虫过程中 使用代理IP是常见的手段 它可以帮助我们隐藏真实
  • Could not find a declaration file for module 'vue-xxx'.

    我尝试添加到项目中的任何第三方Vue js库都会引发以下错误 Could not find a declaration file for module vue xxx Could not find a declaration file fo
  • MySQL 中的共享锁、排他锁与意向锁

    共享锁 Share Lock 共享锁又称读锁 简称 S 锁 一个事务获取了一个数据行的共享锁 其他事务能获得该行对应的共享锁 但不能获得排他锁 即一个事务在读取一个数据行的时候 其他事务可以并发读取数据 但不能对该数据行进行增删改 直到已释