MySQL并发控制 @ 胡巴 | 星期日,十月 22 日,2017 年 | 3 分钟阅读 | 更新于 星期二,九月 28 日,2021 年

关于MySQL并发控制中读写锁与锁粒度的形象举例!

【MySQL】并发控制

1.读写锁

1.1 读写锁的概念

  • ** 读锁(READ LOCK):也叫共享锁,即读锁是共享的,是相互不阻塞的。比如东方明珠,同一时刻站在东方明珠下面的人都可以看见它,不用任何等待,你看的同时也不会影响其他人看。你们看到的是同一个资源,但却不用互相等待。 **

  • ** 写锁(WRITE LOCK):也叫排他锁,即写锁是排他的,是相互阻塞的。比如东方明珠里面的厕所,同一个坑在某一时间段内只能供一位游客使用,其他游客就只能等着。 **

1.2 读写锁的意义

  • ** 实现并发控制,解决读写互相干扰的问题。 **

2.锁粒度

1.1 什么是锁粒度

  • ** 锁粒度就是锁的级别,锁能锁定的层次范围。 **

假设一家餐厅同一时间段一张桌子只允许一个客人用餐,那么这个餐厅要保证这一个条件,可以有以下几种选择:

1.在大门口设立一个守卫(加一把锁),同一时间段只放一个客人进去,让他选一个桌子吃饭。这样整个餐厅都只有一个人,那他选择哪个桌子吃饭,都可以实现同一时间段内一张桌子只有一个客人用餐。当这个客人吃好后,离开饭店,守卫才会放下一个人进来。

2.在大门口不设立守卫,当客人进入餐厅选择一个桌子坐下后,就给这个桌子设立一个守卫(加上一把锁),其他人再进来,桌子旁边如果有守卫,守卫就会阻止这个人在这张桌子就餐。等该桌客人吃完后,将守卫撤走(释放锁),其他人才可以继续选择这个桌子。这种办法同样可以实现同一个时间段内一张桌子只有一个客人用餐。

以上示例中锁粒度就体现在 大门口设立守卫餐桌旁这里守卫 ,同时我们也可以看出不同的锁粒度会影响同一时段内整个餐厅内的就餐人数,即一种 并发数 。第一种方式在 守卫管理 (锁管理)上面会消耗更少的资源,也只需要发一个守卫的工资就够了。而如果没有一个餐桌被客人占用就增加守卫的方式,则明显会增加工资支出,同时对于守卫的管理也要付出更多的精力。但是也很明显,一个守卫的方式明显会大大减少同一时段内餐厅的就餐人数,使餐厅收入大大降低。所以这就需要一种 权衡 了。我们在使用数据库的锁时也是一样,在锁粒度上面要进行一定的权衡。

1.2 锁粒度

  • 表锁(TABLE LOCK)

表锁类似于上面示例中的第一种方案,给整个餐厅设立一个守卫。它是开销最小的策略,当某一个用户对一张表进行增、删、改的时候,就会给这个表加上一个写锁,这样其他用户在同一时段就不能对该表进行读写了。只有这个写操作执行完成释放了写锁后,其他用户才能对这个表进行其他的操作。

** 注意: ** 尽管存储引擎可以管理自己的锁,MySQL 本身还是会使用各种有效的表锁来实现不同的目的。例如:服务器会为诸如 ALTER TABLE 之类的语句使用表锁,而忽略存储引擎的锁机制。

  • 行锁(ROW LOCK)【InnoDB & XtraDB】

行锁则类似与上面示例中的第二种方案,行锁会带来最大的锁开销,但是可以最大程度的支持并发处理。行级锁仅在存储引擎层实现,而MySQL 服务层没有实现。

Copyright © 2017 - 2025 boboidea.com All Rights Reserved 波波创意软件工作室 版权所有 【转载请注明出处】

avatar

BoBo`s Blog每天进步一点点,能多一点是一点

appdata apt-get bloomfilter channel Chatbot ChatGPT Chrome chsh ClickHouse Context css csv CUDA Cursor DaDa英语 Deepseek defer df docker elasticsearch error ffmpeg fix-missing form gif git GitLab globalproject golang hosts HTTP HTTPS iconv IDE Interface iota Kafka LangChain libssl LLM ln mac mac系统更新 Map MCP MetaMCP mkdir MSYS2 mysql n8n nginx oh-my-zsh Ollama openconnect openssl PAM permission php pip PowerShell puppeteer python rabbitmq redis reflect rsync SD sed shell Slice snowflake space SQL SSH struct syntax_err tensorflow ubuntu ue4 unauthorized unreal4 UV vim virtualbox vpn VSCode Windows x86_64 xcode-select YCM zookeeper zsh 上海积分 主从复制 事务 二进制安全 交叉熵 人力资源 代码工具 代码编辑助手 代码评审 以太坊 信息论 全民哀悼 内存管理 内容创作 分屏 分支删除 区块链 匿名函数 协作系统 协议设计 启动盘 品种 图片转视频 均线 夏天 夏季 实用技巧 密码修改 工作流 工作流触发 工具 工具管理 开发工具 开发环境 循环 微信公众号 批处理 批量处理 批量替换 批量重命名 接收器 效率工具 教程 数据分析 数据合并 数据处理 数据查询 数据类型 数据结构 数据聚合 数据转换 文件同步 文件管理 日志切分 智能体 智能合约 替代方案 本地部署 概率论 比特币 水果 治疗 流量分析 浏览器调试 消息队列 版本控制 狗狗币 生活 用户行为 电视 症状 磁盘清理 笔记本技巧 系统配置 编程语言 编译PHP 编辑器 网站统计 网络 自动化 自动化工作流 自动提交 节点 获取方式 虚拟机 西瓜 记忆 购买指南 跨平台 软连接 运维技巧 闭包 集成 雪花算法 面瘫 鞋子 项目无法编译
基本信息
  • 姓名:bobo
  • 花名:胡巴
  • 性别:男
  • 血型:O型
  • 星座:白羊座

联系方式

  • 所在地:上海
  • QQ:279250819
  • 微信号:wanghuiwoshinideyou
  • 电子邮件:279250819@qq.com

博客地址

公众号

alt 无限递归

工作经历
  • 2022.5 - 至今

    • 公司:乐府互娱
    • 职位:高级SDK工程师
  • 2019.6 - 2022.4

    • 公司:萌推(上海突进网络科技有限公司)
    • 职位:中级PHP工程师 & 初级golang工程师
    • 荣誉:
      • 绩效A连续得主
      • 月度之星
      • 优秀个人奖
    • 所作所为:
      • 利用ES优化OMS、MMS管理系统商品列表查询
      • 利用消息队列、Redis、乐观锁优化商品审核流程
      • 利用Redis对商家端接口进行有效限流
      • 优化商品相关表索引,提升SQL查询速度
      • 商品中台构建,统一商品相关操作
      • 大表优化(数据分离、分表、大字段拆分)
      • 掌握所有商品核心流程
  • 2018.5 - 2019.5

    • 公司:DaDa英语(上海卓赞教育信息科技有限公司)
    • 职位:中级PHP开发工程师
    • 荣誉:无
    • 所作所为:
      • 利用ES优化教师CMS系统统计数据接口至500ms内
      • 工单系统开发及持续优化
      • 教师CMS系统的功能开发及持续优化
  • 2018.3 - 2018.5

    • 公司:波奇(上海)信息科技有限公司
    • 职位:初级PHP开发工程师
    • 荣誉:同下
    • 所做作为:如下
  • 2016.7 - 2018.3

    • 公司:光橙(上海)信息科技有限公司
    • 职位:初级PHP开发工程师
    • 荣誉:
      • 年度最佳进步奖
    • 所作所为:
      • 利用Redis提升商详接口最佳响应速度至50ms内
      • 利用Redis提升双11活动页可承受QPS至500以上
      • 利用Redis对接口进行简单限流
      • 与小伙伴合作提升搜索质量(ES初识)
      • 其他C端接口的开发及优化
      • B端商城老页面的维护及优化
SKILLS

编程语言

  • PHP
  • Golang
  • Shell
  • JAVA
  • JS
  • HTML\CSS

数据库

  • MySQL
  • Redis
  • Clickhouse

消息中间件

  • RabbitMq
  • Kafka

文档撰写

  • Swagger
  • Markdown

技术框架

  • Laravel
  • gin

搜索引擎

  • ElasticSearch

抓包工具

  • Charles