MySQL中的锁

锁的级别

MySQL支持四种级别的锁:全局锁、表级锁、页级锁、行级锁

MyISAM和Memory存储引擎采用的是表级锁;

InnoDB存储引擎既支持行级锁,也支持表级锁,但默认情况下是采用行级锁。

全局锁

全局锁就是对整个数据库进行加锁,加锁后整个数据库就是只读状态,经常被用于整个数据库的备份操作中,保证数据的完整性。

加锁语法:

flush tables with lock;

释放锁语法:

unlocak tables;

表级锁

开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

表级锁的分类:

  • 共享锁:又叫读锁,不会阻塞其他用户对同一表的读操作,但会阻塞对同一表的写操作。
  • 独占锁:又叫写锁,会阻塞其他用户对同一表的读和写操作。
独占锁共享锁
独占锁冲突冲突
共享锁冲突兼容
加共享锁

在执行查询语句(select)前,会自动给涉及的所有表加读锁。

加独占锁

在执行更新操作(select、update、insert)前,会自动给涉及的表加写锁。

表锁的加锁过程并不需要用户干预,用户一般不需要直接用 LOCK TABLE 命令给表手动加锁。

如果需要手动加锁,在执行 LOCK TABLES 后,只能访问显式加锁的这些表,不能访问未加锁的表。

锁定表-语法:lock table tbl_name {READ | WRITE};

解锁表-语法:unlock tables

(当手动加锁时,如果同一个表在SQL语句中出现多次,则要通过与SQL语句中相同的别名锁定多次,例如:lock table sys_user as a read,sys_user as b read

行级锁

只在InnoDB存储引擎中支持。

开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。

InnoDB行锁是通过索引实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

行级锁的分类:

  • S-共享锁:又叫读锁,其他事务可以继续加共享锁,但是不能继续加排他锁。
  • X-排他锁:又叫写锁,一旦加了写锁之后,其他事务就不能加锁了。
X-排它锁S-共享锁不加锁(Select)
X-排它锁冲突冲突兼容
S-共享锁冲突兼容兼容

InnoDB引擎默认的修改数据操作(update、delete、insert)都会自动给涉及到的数据加上排他锁,而select语句默认不会加任何锁类型。

加排它锁(X)

语法: select … for update

解释:不希望别的事务修改数据,其他的事务只能用不带锁的select来查询,无法进行update、delete、insert

加共享锁(S)

语法:select … lock in share mode

解释:不希望别的事务修改数据,但可以用select不带任何锁来查询数据或同样添加共享锁来查询数据

InnoDB在加排它锁或共享锁的同时,会在表上增加一个表级的意向排它锁或意向共享锁。

意向锁使得其他事务在对表增加表锁时,不需要遍历表中的所有数据,来判断是否有数据被加锁。

意向排它锁:其他事务可以对其他数据加行级锁,但不能增加表级读锁或写锁

意向共享锁:其他事务可以对其他数据加行级锁,也可以增加表级读锁,但不能增加表级写锁

(意向锁只是InnoDB中的一个性能优化机制,了解即可)

锁的策略

分为悲观锁和乐观锁,是人们定义出来的概念,可以理解为一种思想,不属于MySQL中的锁机制。

悲观锁

对于数据的处理持悲观态度,总认为会发生冲突,获取和修改数据时,别人也会修改数据。

实现方法:在MySQL中,所有的锁机制都是悲观锁,例如:排它锁和共享锁。

应用场景:悲观锁通常在发生冲突几率较大时使用,悲观锁保证了数据处理的安全性,但也增加了事务加锁的开销,降低了效率。

乐观锁

对数据的处理持乐观态度,认为一般情况下不会发生冲突,只会在提交数据更新时,才会对数据是否冲突进行检测。

实现方法:一般通过记录数据版本来实现,在数据表中增加version版本号字段,在更新数据时判断是否与数据取出时的数据版本号一致,一致则更新数据并更新版本号,如果不一致,则根据业务需求再进行处理。乐观锁是基于程序来实现的,所以不存在死锁的情况,适用于冲突比较少的场景。

其他

死锁

在InnoDB存储引擎中,行级锁可能会发生死锁(指多个事务互相请求对方所占用的资源时,导致一种互相等待的现象)

死锁解决方法:

  • 增加死锁检测机制
  • 使用乐观锁
  • 调整事务隔离级别(串行化隔离级别可避免死锁的发生,但是会严重影响性能)

自增长锁

​ 自增长锁是一种特殊的表锁机制,在事务对包含了 AUTO_INCREMENT 列的表中新增数据时就会去持有自增锁,其他事务尝试执行插入时,则会被阻塞。自增锁在sql执行完就释放锁,并不是事务执行完。

在MySQL5.1.2版本之后,可以手动调整自增加锁的方式。

获取当前锁的语法:

show variables like 'innodb_autoinc_lock_mode';

innodb_autoinc_lock_mode有3种模式:0、1、2,分别对应”传统模式”, “连续模式”, “交错模式”。

  • 传统模式:所有的 insert 语句串行执行,可以保证单个语句内生成的自增值是连续的,性能较差。

  • 连续模式:MySQL8.0之前默认的模式,在该模式下,如果 insert 语句能够提前确定插入的数据量,则可以不用获取自增锁(例如简单的 insert into)。如果 insert 语句不能提前确定数据量,则会去获取自增锁(例如 insert into … select … )。

  • 交错模式:该模式下,所有 insert 语句(包含可确定数据量的和不可确定数据量的)都不会使用自增锁,而是使用较为轻量的 mutex 锁,多条 insert 语句可以并发执行。但是副作用是单个 insert 语句的自增值无法保证连续,AUTO_INCREMENT 的值分配会在多个 insert 语句中来回交叉执行。

    交错模式缺陷:在使用MySQL的Binlog进行主从同步时,如果采用 Statement,那么就不能将自增锁模式设置为交错模式,因为 Statement 模式是基于语句的,只记录对数据做了修改的SQL语句,如果自增锁模式设置为交错模式,那么就有可能会导致主从库同一数据的 AUTO_INCREMENT 列的值不一致(因为交错模式的特性)

元数据锁(MDL)

元数据锁是MySQL为了避免表数据在增删改查时,执行了DDL(定义数据库表字段)导致冲突而增加的锁。

在访问任何一张表的时候,MySQL都会在表上增加元数据锁,无需显示使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/67370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 1.2.1 使用Eclipse + ADT + SDK开发Android APP

1.2.1 使用Eclipse ADT SDK开发Android APP 1.前言 这里我们有两条路可以选,直接使用封装好的用于开发Android的ADT Bundle,或者自己进行配置 因为谷歌已经放弃了ADT的更新,官网上也取消的下载链接,这里提供谷歌放弃更新前最新…

Bean 的六种作用域

目录 一、作用域是什么? 1、singleton(单例作用域) 2、prototype(原型作用域) 3、request(请求作用域) 4、session(回话作用域) 5、application(全局作用域&a…

亚马逊云科技通过生成式AI,帮助清华RIOS加速计算和分析的处理效率

近日,硬件创建平台Efabless宣布了其第一届“生成式AI开源芯片设计挑战赛”(AI Generated Open-Source Silicon Design Challenge)的评选结果。来自清华大学的RISC-V国际开源实验室(RIOS Lab)团队基于亚马逊云科技云上科…

android 获取当前程序所占内存

目录 android jni中c获取当前程序所占内存 可以使用 Runtime 类和 MemoryInfo 类。 获取特定进程(例如当前应用程序)的内存信息,可以使用 getProcessMemoryInfo 方法, android jni中c获取当前程序所占内存 在Android的JNI环境…

web前段与后端的区别优漫动游

要了解web前后端的区别,首先必须得清楚什么是web前端和web后端。 web前段与后端的区别 首先:web的本意是蜘蛛网和网的意思,在网页设计中我们称为网页的意思。现广泛译作网络、互联网等技术领域。表现为三种形式,即超文本(hyp…

链路追踪Skywalking应用实战

目录 1 Skywalking应用2 agent下载3 agent应用3.1 应用名配置3.2 IDEA集成使用agent3.3 生产环境使用agent 4 Rocketbot4.1 Rocketbot-仪表盘4.2 Rocketbot-拓扑图4.3 追踪4.4 性能分析4.5 告警4.5.1 警告规则详解4.5.2 Webhook规则4.5.3 自定义Webhook消息接收 1 Skywalking应…

spacy安装旧版本en_core_web_sm的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

js+html实现打字游戏v1

实现逻辑:设置定时器每秒刷新一次,定时器刷新多少次执行一次生成单词操作来决定单词的生成速度,例如初始单词生成速度为1,那么定时器刷新5次才生成一次单词,每个单词用span来装,每组10个单词放到div里。监听…

【idea学习】

1.debug: 文章详解 2.导入SpringBoot项目 文章详情

C++中位运算符使用

& 与 只有都为1结果为1 0 & 0 00 & 1 01 & 0 01 & 1 1 | 或 只要一个为1结果为1 0|00 0|11 1|01 1|11 ^ 异或 两个相同的数字为0,其余为1 0^00 1^01 0^11 1^10 ~ 取反 将进制位数进行取反 ~1-2 //0000 0001-->代…

关于web3.0平台的详细说明

Web3.0是指下一代互联网的发展阶段,它以区块链技术为基础,具有去中心化、安全性强、用户数据私密性保护等特点。在Web3.0的社交平台中,人们可以更好地掌控自己的数据,并获得更加开放和透明的社交体验。 以下是一些关于Web3.0社交…

宝塔面板一键部署Z-Blog博客 - 内网穿透实现公网访问

文章目录 1.前言2.网站搭建2.1. 网页下载和安装2.2.网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测试5.结语 1.前言 Ubuntu系统作…

es6解构用法

一: 解构数组 二:解构对象 一: 解构数组 原理:模式(结构匹配), 索引值相同的完成赋值 总结:位置对应 二:解构对象 原理:模式(结构匹配), 属性名相同的完成赋值 {}{} 对象结构赋值的应用 常用的就以上两种 &#…

Android 13 - Media框架(10)- NuPlayer::Renderer

这一节我们来了解 NuPlayer Renderer 是如何工作,avsync 机制是如何运行的。 1、创建 Renderer void NuPlayer::onStart(int64_t startPositionUs, MediaPlayerSeekMode mode) {if (mSource->isRealTime()) {flags | Renderer::FLAG_REAL_TIME;} ......if (mOff…

Shotcut for Mac:一款强大而易于使用的视频编辑器

随着数码相机的普及,视频编辑已成为我们日常生活的一部分。对于许多专业和非专业用户来说,找到一个易于使用且功能强大的视频编辑器是至关重要的。今天,我们将向您介绍Shotcut——一款专为Mac用户设计的强大视频编辑器。 什么是Shotcut&…

恒运资本:沪指涨逾1%,金融、地产等板块走强,北向资金净买入超60亿元

4日早盘,两市股指盘中强势上扬,沪指、深成指涨超1%,上证50指数涨近2%;两市半日成交约5500亿元,北向资金大举流入,半日净买入超60亿元。 截至午间收盘,沪指涨1.12%报3168.38点,深成指…

164到网络安全面试大全(附答案)

最近有不少小伙伴跑来咨询: 想找网络安全工作,应该要怎么进行技术面试准备?工作不到 2 年,想跳槽看下机会,有没有相关的面试题呢? 为了更好地帮助大家高薪就业,今天就给大家分享两份网络安全工…

基于卡尔曼滤波的锂电池状态估计MATLAB仿真及程序

完整资源请查看主页置顶博客(专享优惠) 该项目的目的是估计锂电池的荷电状态(SOC)。主要完成了扩展卡尔曼滤波(EKF)的实验、参数辨识和仿真。 项目中包括锂电池模型建立、参数辨识与验证、SOC估计采用扩展卡尔曼滤波(EKF),使用了两种方式实…

ensp基础命令大全(华为设备命令)

路漫漫其修远兮,吾将上下而求索 今天写一些曾经学习过的网络笔记,希望对您的学习有所帮助。 OSPF,BGP,IS-IS的命令笔记没有写上来,计划单独写,敬请期待,或者您可以在这个网站查查 : 万能查询网站 …

详解Spring Boot中@value的使用方式

如何在Spring Boot中使用value获得配置文件中的内容。 value的常见用法以及案例 Value 注解是 Spring 框架中强大且常用的注解之一,在 Spring 框架中具有以下几个重要的意义: 一、属性值注入: Value注解的主要目的是将属性值注入到 Sprin…