当前位置: 首页 > news >正文

从阻塞来聊聊mysql的 排他锁 共享锁 mvcc乐观锁;间隙锁;

索引更新的阻塞

事务1
set AUTOCOMMIT=FALSE;
UPDATE  course   SET  course_id=6  WHERE  course_id =1; (6 排他锁  1 )
select * from course where  course_id = 6
rollback 
commit 事务2set AUTOCOMMIT=FALSE;
UPDATE  course   SET  course_id=7  WHERE  course_id =6; ( 6 是排他锁 7 )
select * from course where  course_id = 6ROLLBACK;commit;

排他锁与mvcc相遇;

上了排他锁之后,另一个事务中只能阻塞;

数据修改时会根据过滤条件匹配对应的索引,在对应的索引键值上加锁,
如果语句中修改了索引的值,还会在修改后的值上增加锁。

其他事务使用了相同的索引值修改数据不管是否是相同的行均会被阻塞。

索引的增加删除 和更改

insert 阻塞update 和delete
delete 会阻塞update 和delete

for update上的什么锁

FOR UPDATE 锁的行为
锁定行为:FOR UPDATE 会在被检索的行上放置排他锁。
锁定范围:锁定范围取决于查询条件和索引的存在与否。
如果查询条件涉及到主键或唯一索引,则只会锁定匹配的行。
如果查询条件不涉及主键或唯一索引,可能会锁定更多的行或整个表,具体取决于使用的存储引擎和查询的具体情况。
锁定级别:默认情况下,InnoDB 存储引擎使用行级锁,但在某些情况下可能会升级为更高级别的锁。
锁的类型
排他锁(Exclusive Lock, X-Lock):当一个事务获得了排他锁后,其他事务不能对该数据进行任何读写操作,直到锁被释放。
共享锁(Shared Lock, S-Lock):多个事务可以同时获得共享锁,但如果有事务想要获取排他锁,则所有持有共享锁的事务都将被阻塞。
FOR UPDATE 锁的特性
InnoDB 存储引擎:FOR UPDATE 仅适用于 InnoDB 存储引擎,并且必须在事务中使用。
锁定时间:锁定会在事务开始时(例如使用 BEGIN 或 START TRANSACTION 开始事务)生效,并持续到事务结束(使用 COMMIT 或 ROLLBACK)。
锁升级:如果查询没有使用适当的索引,InnoDB 可能会将行级锁升级为表级锁。
阻塞:当一个事务使用 FOR UPDATE 获取锁时,其他想要修改相同数据的事务会被阻塞,直到第一个事务释放锁。
示例

共享锁;

SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE;

  1. 并发读取
    允许多个读取事务:共享锁允许多个事务同时读取同一数据,这有助于提高系统的并发性能。
    避免读写冲突:当一个事务对数据加上共享锁后,其他事务只能再对相同数据加上共享锁,而不能加上排他锁。这样就避免了读取事务与写入事务之间的冲突。
  2. 数据一致性
    保证数据一致性:共享锁确保了在同一时刻,多个读取事务可以看到一致的数据版本,这对于需要读取一致数据的应用来说非常重要。
    避免脏读:共享锁可以防止事务读取到未提交的数据,即避免了读取脏数据的情况。
  3. 提高并发性能
    减少阻塞:共享锁减少了读取事务之间的阻塞,因为多个读取事务可以并发执行。
    减少锁竞争:由于多个事务可以同时持有共享锁,因此减少了锁的竞争,提高了系统的吞吐量。
  4. 事务隔离级别

乐观锁

MVCC 与锁的关系
读取操作:MVCC 允许事务读取数据的旧版本,而不是等待写入操作完成。这意味着读取操作通常不需要加锁。
写入操作:当一个事务执行写入操作时,MVCC 会在数据行旁边创建一个新的版本,而不是直接修改现有的行数据。这也意味着写入操作通常也不需要加锁。
MVCC 如何避免锁
版本管理:每个数据行都包含了多个版本的信息,包括创建该版本的事务 ID 和删除该版本的事务 ID。
读取一致性:当一个事务执行读取操作时,它会根据自己的事务 ID 和数据行的版本信息来决定哪些版本的数据是可以看到的。这通常是通过一个叫做 Read View 的机制来实现的。
写入操作:当一个事务执行写入操作时,InnoDB 会为数据行创建一个新的版本,并且保留旧版本供其他事务读取。这意味着更新操作实际上是在数据行旁边创建了一个新的版本,而不是直接修改现有的行数据

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 目标检测之数据增强
  • 探索Ubuntu网络监控:安装与使用流行工具的指南
  • 外部排序(败者树、置换-选择排序、最佳归并树)
  • Xilinx FPGA在线升级——汇总
  • <keep-alive> 一分钟了解
  • Datawhale-动手学CV-Pytorch-MNIST分类实战代码解读
  • 浏览器后门:保护影子 IT 的新前线
  • JAVA maven pom下载失败问题处理
  • 代码设计:设计模式:中介者模式
  • idea鼠标悬浮显示注释
  • Table API SQL的概念和通用API
  • 具有重新参数化异构卷积的多分支辅助融合YOLO,用于精确的目标检测(MAF-YOLO)
  • Spring——IOC/DI思想
  • 打造编程学习的“知识宝库”:解锁高效笔记记录与整理的秘籍
  • 刷到好听的音频怎么办
  • Debian下无root权限使用Python访问Oracle
  • java8 Stream Pipelines 浅析
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Spring Cloud Feign的两种使用姿势
  • 从零开始学习部署
  • 服务器从安装到部署全过程(二)
  • 缓存与缓冲
  • 设计模式 开闭原则
  • 使用docker-compose进行多节点部署
  • 微信小程序--------语音识别(前端自己也能玩)
  • 译有关态射的一切
  • 用Visual Studio开发以太坊智能合约
  • 自动记录MySQL慢查询快照脚本
  • ​linux启动进程的方式
  • #HarmonyOS:软件安装window和mac预览Hello World
  • $.ajax()
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (C语言)逆序输出字符串
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (全注解开发)学习Spring-MVC的第三天
  • (转)memcache、redis缓存
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .describe() python_Python-Win32com-Excel
  • .Family_物联网
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .Net8 Blazor 尝鲜
  • .NET简谈设计模式之(单件模式)
  • .net连接oracle数据库
  • .net生成的类,跨工程调用显示注释
  • .Net中间语言BeforeFieldInit
  • @Value读取properties中文乱码解决方案
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [2010-8-30]
  • [383] 赎金信 js
  • [CERC2017]Cumulative Code
  • [CSS]浮动