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

mysql锁分类大全

前言

为什么会出现锁

MySQL中的锁是为了保证并发操作的正确性和一致性而存在的。

当多个用户同时对同一份数据进行操作时,如果不加控制地进行读写操作,就可能导致数据不一致的问题。例如,当多个用户同时对同一行数据进行写操作时,就可能出现数据被覆盖的情况。这时,通过使用锁,可以控制用户对数据的访问,保证同一时间只有一个用户对数据进行修改或者读取操作,从而避免数据的不一致。

模式分类

乐观锁(Optimistic Locking)

是什么

乐观锁并不是锁,而是锁的设计思想。认为对同一数据的并发操作不会总发生,属于小概率事件,不用每次都对数据上锁,而是在更新时检查数据版本(通常是一个版本号或时间戳),如果版本号或时间戳与之前的一致,则认为数据没有被修改,可以更新;如果不一致,则认为数据已经被修改,更新操作失败。这种方式不会阻塞其他访问请求,但是如果冲突频繁发生,则需要重试更新操作,可能会增加系统的复杂度。

优缺点

  • 优点:

乐观并发控制没有实际加锁,所以没有额外开销,也不错出现死锁问题,适用于读多写少的并发场景,因为没有额外开销,所以能极大提高数据库的性能。。

  • 缺点:

乐观并发控制不适合于写多读少的并发场景下,因为会出现很多的写冲突,导致数据写入要多次等待重试,在这种情况下,其开销实际上是比悲观锁更高的。而且乐观锁的业务逻辑比悲观锁要更为复杂,业务逻辑上要考虑到失败,等待重试的情况,而且也无法避免其他第三方系统对数据库的直接修改的情况。

怎么玩

悲观锁(Pessimistic Locking)

是什么

悲观锁也是一种思想,对数据被其他事务的修改持保守态度,每次更新数据钱都会添加锁,会通过数据库自身的锁机制来实现,从而保证数据操作的排它性。

优缺点

  • 优点:

悲观并发控制采取的是保守策略:“先取锁,成功了才访问数据”,这保证了数据获取和修改都是有序进行的,因此适合在写多读少的环境中使用。当然使用悲观锁无法维持非常高的性能,但是在乐观锁也无法提供更好的性能前提下,悲观锁却可以做到保证数据的安全性。

  • 缺点:

由于需要加锁,而且可能面临锁冲突甚至死锁的问题,悲观并发控制增加了系统的额外开销,降低了系统的效率,同时也会降低了系统的并行性。

怎么玩

按颗粒度分类

InnoDBMyISAMBDB
表锁truetruetrue
页锁falsefalsetrue
行锁truefalsefalse

全局锁(Global Lock)

是什么

全局锁就是对整个数据库实例加锁,加锁后的整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。

优缺点

  • 优点:
  1. 简单:全局锁是 MySQL 内部实现的一种简单锁机制,可以很容易地使用。

  2. 稳定:全局锁是最稳定的锁,能够保证操作的一致性和安全性。

  3. 效率高:当需要执行全局操作时,全局锁是最高效的锁机制。它可以在很短的时间内锁定整个数据库,确保操作的原子性。

  4. 灵活:MySQL 全局锁还可以用于备份和恢复数据库、进行主从同步等。

  5. 安全:全局锁可以保证数据的完整性和一致性,防止数据丢失和损坏。

  • 缺点:

它会对数据库的并发性能产生很大的影响,并且会导致其他用户的请求被阻塞。因此,在使用全局锁时需要慎重考虑其优缺点,确保操作的安全和效率。

怎么玩

加锁

flush tables with read lock

解锁

unlock tables

表级锁(Table Lock)

是什么

表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分 MySQL 引擎支持;

优缺点

  • 优点:

开销小,加锁快;不会出现死锁;

  • 缺点:

锁定粒度大,发出锁冲突的概率最高,并发度最低。

怎么玩

加表读锁或叫共享锁

lock tables t_student read;

加表写锁或叫独占锁

lock tables t_stuent write;

解锁

unlock tables

页级锁(Page Lock)

是什么

锁定表中某些行集合(称做页),被锁定的行只对锁定最初的线程是可行。如果另外一个线程想要向这些行写数据,它必须等到锁被释放。不过其他页的行仍然可以使用。在MySQL5.1之前BDB引擎默认页级锁,之后被弃用。

优缺点

  • 优点:
  1. 提高并发性能:页级锁的粒度比表级锁小,可以让更多的并发事务同时访问不同的数据页,从而提高了并发性能。
  2. 减少锁冲突:页级锁只锁定需要修改的数据页,减少了锁冲突的可能性,降低了锁等待时间和死锁的风险。
  3. 提高精度:由于锁的粒度更细,所以事务只需要锁定需要修改的数据页,而不是整个表,这提高了锁的精度,减少了不必要的锁。
  • 缺点:
  1. 内存开销较大:MySQL在使用页级锁时需要维护大量的锁信息,这些信息需要占用内存,如果数据表很大,锁信息的存储可能会占用较多的内存。
  2. 锁定时间较长:由于页级锁只锁定需要修改的数据页,而不是整个表,因此锁定的时间会相对较长,尤其是在对大量数据进行操作时,这会导致并发性能下降。
  3. 容易造成页分裂:页级锁需要将表分成若干页,如果频繁对数据进行修改,会导致数据页不断增加,从而容易造成页分裂,进一步增加了内存的占用。

怎么玩

SELECT * FROM table_name WHERE id BETWEEN 1 AND 100 FOR UPDATE;

行级锁(Row Lock)

是什么

基于索引数据结构实现,是 MySQL 中锁定粒度最细的一种锁,只有线程当前使用的行被锁定,其他行对于其他线程都是可用的;InnoDB引擎默认的锁级别。

注意:

InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁。

优缺点

  • 优点:

发生锁冲突几率低,并发高

  • 缺点:

开销大,加锁慢;会出现死锁的情况;

怎么玩

  • 记录锁(Record Locks)

几对某条记录加锁

update user set age=10 where id=1
  • 间隙锁(Gap Locks)

即对某个范围加锁,但是不包含范围的临界数据

update user set age=10 where id>10 and id<10
  • 临键锁(Next-Key Locks)

又记录锁和间隙锁组成,既包含记录本身又包含范围,左开右闭区间

update user set age=10 where id>10 and id<=10

属性分类

共享锁/读锁(Shared Lock/S锁)

是什么

是用于读取数据时使用的一种锁。当一个事务对一个数据对象加上共享锁时,其他事务也可以对该数据对象加上共享锁,但是不能对其加上排它锁。也就是说,其他事务可远观而不可亵玩焉。

优缺点

  • 优点:

因为共享锁可以让多个事务在同一时间访问同一资源,所以在读多写少的情况下,共享锁能够提高系统的并发性能和吞吐量。

  • 缺点:
  1. 共享锁对于写操作是阻塞的,即如果一个事务已经持有了共享锁,其他事务就不能获取排它锁,也就不能对该资源进行写操作;
  2. 共享锁不能保证数据的一致性,即多个事务同时进行读操作时可能读取到的数据是不一致的。

怎么玩

在select语句末尾加上lock in share mode关键字。

# 对id=1的用户加读锁
select * from user where id=1 lock in share mode;

排它锁/写锁(Exclusive Lock/X锁)

是什么

是用于修改数据时使用的一种锁。当一个事务对一个数据对象加上排它锁时,其他事务既不能对该数据对象加上共享锁,也不能对其加上排它锁。也就是说,其他事物不可远观更不可能亵玩焉

优缺点

  • 优点:
  1. 排它锁可以保证在同一时间只有一个事务可以对资源进行写操作,从而避免了数据的不一致性;
  2. 排它锁在进行写操作时可以保证数据的完整性,从而保证了数据的正确性。
  • 缺点:
  1. 排它锁会阻塞其他事务的读写操作,从而降低了系统的并发性能和吞吐量;
  2. 如果某个事务持有了排它锁并且出现了死锁,其他事务将无法获取该资源的锁,从而无法进行读写操作。

怎么玩

在select语句末尾加上for update关键字。

# 对id=1的用户加写锁
select * from user where id=1 for update;

小扩展(意向锁)

InnoDB所用的表级锁,其设计目的主要是为了在一个事务中揭示下一步将要被请求的锁的类型。

意向共享锁(IS)

表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁

意向排他锁(IX)

类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。

怎么玩

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

小结

MySQL的锁没有优劣之分,只有是否更适合当前场景的合适度之说。

在实际应用中,需要根据具体的场景选择适当的锁类型,以达到合理的性能和数据一致性。例如,如果需要高并发的读写操作,可以使用行锁来避免资源竞争和冲突;如果需要修改整张表的结构,可以使用表锁来避免并发问题。此外,还需要注意锁的范围和持续时间,尽可能减少锁的持有时间,以提高并发性能。

相关文章:

mysql锁分类大全

前言 为什么会出现锁 MySQL中的锁是为了保证并发操作的正确性和一致性而存在的。 当多个用户同时对同一份数据进行操作时&#xff0c;如果不加控制地进行读写操作&#xff0c;就可能导致数据不一致的问题。例如&#xff0c;当多个用户同时对同一行数据进行写操作时&#xff…...

推荐几款主流好用的远程终端连接管理软件

一、介绍 远程终端连接管理软件是管理服务器、虚拟机等远程计算机系统不可或缺的工具之一&#xff0c;它可以通过网络连接到另一台计算机&#xff0c;以执行命令、编辑文件或进行其他管理任务&#xff0c;下面我将为大家介绍几款主流好用的远程终端连接管理软件&#xff0c;并…...

描述性统计

参考文献 威廉 M 门登霍尔 《统计学》 文章目录定性数据的描述方法条形图饼图帕累托图定量数据点图茎叶图频数分布直方图MINITAB 工具在威廉《统计学》一书将统计学分为描述统计学和推断统计学&#xff0c;他们的定义分别如下&#xff1a;描述统计学&#xff1a;致力于数据集的…...

第十四届蓝桥杯三月真题刷题训练——第 7 天

目录 第 1 题&#xff1a;三角回文数 问题描述 答案提交 运行限制 代码&#xff1a; 第 2 题&#xff1a;数数 问题描述 答案提交 运行限制 代码&#xff1a; 第 3 题&#xff1a;倍数问题_同余定理_分情况讨论 题目描述 输入描述 输出描述 输入输出样例 运行限…...

剑指 Offer 57. 和为s的两个数字

一、题目 输入一个递增排序的数组和一个数字s&#xff0c;在数组中查找两个数&#xff0c;使得它们的和正好是s。如果有多对数字的和等于s&#xff0c;则输出任意一对即可。 示例 1&#xff1a; 输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1a;[2,7] 或者 [7…...

PDF转word在线转换方法!操作简单又高效

相信很多已经工作的人都知道&#xff0c;PDF文件格式的优点在于兼容性强、安全性高&#xff0c;而且查看和传输给他人都很方便。但是&#xff0c;这种格式的文件也有不太方便的地方&#xff0c;那就是不能对文件内容进行编辑和修改。对于许多人来说&#xff0c;如果想要编辑修改…...

Jquery项目中使用vue.js

大家在工作的情况中&#xff0c;可能会遇到之前的老项目采用jq书写&#xff0c;或者修改或者新增功能在jq中&#xff0c;原始jq的项目,代码可维护性很差,一个页面几千行jq,可维护性很差,工作量巨大&#xff0c;所以这个时候大家可以引入vue.js。 第一步&#xff1a;引入vue.js…...

蓝桥杯 删除字符

题目描述 给定一个单词&#xff0c;请问在单词中删除 t 个字母后&#xff0c;能得到的字典序最小的单词是什么&#xff1f; 输入描述 输入的第一行包含一个单词&#xff0c;由大写英文字母组成。 第二行包含一个正整数 t。 其中&#xff0c;单词长度不超过 100&#xff0c…...

析构函数 对象数组 对象指针

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章 &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下定决心去做” &#x1…...

Vue对Axios网络请求进行封装

一、为什么要对网络请求进行封装&#xff1f; 因为网络请求的使用率实在是太高了&#xff0c;我们有的时候为了程序的一个可维护性&#xff0c;会把同样的东西放在一起&#xff0c;后期找起来会很方便&#xff0c;这就是封装的主要意义。 二、如何进行封装&#xff1f; 1、将…...

Android framework HAL(HIDL)

简述 当你在Android系统中使用不同的硬件设备&#xff08;例如摄像头、传感器、音频设备等&#xff09;时&#xff0c;你需要与硬件抽象层&#xff08;HAL&#xff09;进行通信。 HAL是一个中间层&#xff0c;它充当了硬件和应用程序之间的桥梁。但是&#xff0c;由于硬件设备…...

QML 模型(ListModel)

LIstModel&#xff08;列表模型&#xff09; ListModel 是ListElement定义的简单容器&#xff0c;每个定义都包含数据角色。内容可以在 QML 中动态定义或显式定义。 属性&#xff1a; count模型中数据条目的数量dynamic动态角色&#xff0c;默认情况下&#xff0c;角色的类型…...

你还在调戏AI,有的公司已经用ChatGPT开展业务了

近日&#xff0c;OpenAI 正式宣布开放 ChatGPT 和 Whisper 两个模型的 API&#xff0c;API 版本的ChatGPT 不仅功能更多、性能更强&#xff0c;而且还更便宜一一相当于目前 GPT-3 模型价格打一折!划重点OpenAl正式开放 ChatGPT 和 Whisper 模型的 API&#xff0c;目前 SnapChat…...

DatenLord前沿技术分享 No.20

达坦科技专注于打造新一代开源跨云存储平台DatenLord&#xff0c;致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题&#xff0c;以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。喷泉码具有极高的纠错能力&#xff0c;且具有低延迟、地复…...

基于vivado(语言Verilog)的FPGA学习(1)——了解viviado面板和编译过程

基于vivado&#xff08;语言Verilog&#xff09;的FPGA学习&#xff08;1&#xff09;——了解程序面板和编译过程 每日废话&#xff1a;最近找实习略微一些焦虑&#xff0c;不想找软件开发&#xff0c;虽然有些C和python基础&#xff08;之前上课学的&#xff09;&#xff0c;…...

PACS(CT、CR、DR、MR、DSA、RF医院影像管理系统源码)

PACS具体功能介绍&#xff1a; 病人、采集、观片、三维、报告、照相、退出、文件、图像采集、观片操作、三维、测量标注、诊断报告、照相打印、统计报表、系统管理、帮助、病人浏览器、选择数据源、打开图像、病人登记、工作列表、采集、打开画廊。 DICOM查询/获取&#xff1a…...

Centos7 安装Mysql8.0

1、到指定目录下下载安装包[rootVM-0-14-centos ~]# cd /usr/local/src2、下载mysql8[rootVM-0-14-centos src]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz3、解压mysql8, 通过xz命令解压出tar包&#xff0c; 然后通过t…...

2023年全国最新道路运输从业人员精选真题及答案18

百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 181.某客运企业拥有55辆营运客车&#xff0c;下列关于该企业设置…...

web worker的基本使用案例

文件目录如下 代码按照顺序分别如下 webworker.html <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewpo…...

机器看世界

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...