我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mysql中锁的使用场景是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mysql中锁的使用场景是什么

这篇文章主要讲解了“Mysql中锁的使用场景是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql中锁的使用场景是什么”吧!

Mysql中锁的使用场景是什么

一、常见锁类型

  • 表级锁,锁定整张表

  • 页级锁,锁定一页

  • 行级锁,锁定一行

  • 共享锁,也叫S锁,在MyISAM中也叫读锁

  • 排他锁,也叫X锁,在MyISAM中也叫写锁

  • 悲观锁,抽象性质,其实不真实存在

  • 乐观锁,抽象性质,其实不真实存在

Mysql中锁的使用场景是什么
常见锁类型

二、Mysql引擎介绍

  • 其实mysql中的引擎有很多种类,其中InnoDB和MyISAM引擎最常用

  • 在mysql5.5版本前默认使用MyISAM引擎,之后使用InnoDB引擎

  • 查看数据库引擎命令如下

show variables like '%storage_engine%';

三、常用引擎间的区别

  • MyISAM 操作数据都是使用的表锁,你更新一条记录就要锁整个表,导致性能较低,并发不高。当然同时它也不会存在死锁问题。

  • 而 InnoDB 与 MyISAM 的最大不同有两点:一是 InnoDB 支持事务;二是 InnoDB 采用了行级锁。

  • 在 Mysql 中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql 语句操作了主键索引,Mysql 就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。

  • InnoDB 行锁是通过给索引项加锁实现的,如果没有索引,InnoDB 会通过隐藏的聚簇索引来对记录加锁。也就是说:如果不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁,实际效果跟表锁一样。因为没有了索引,找到某一条记录就得扫描全表,要扫描全表,就得锁定表。

四、共享锁与排他锁

  • 数据库的增删改操作默认都会加排他锁,而查询不会加任何锁。

  • 共享锁:对某一资源加共享锁,自身可以读该资源,其他人也可以读该资源(也可以再继续加共享锁,即 共享锁可多个共存),但无法修改。要想修改就必须等所有共享锁都释放完之后。

  • 排他锁:对某一资源加排他锁,自身可以进行增删改查,其他人无法进行任何操作。

//共享锁
select * from 表名 lock in share mode

//排他锁
select * from 表名 for update

五、排他锁的实际应用

  • 这里我们以两个操作数据库的请求为例,假设这两个请求分别为T1和T2

  • 假设T1为查询请求,而T2为更新数据请求,在T1查询很长时间的时候,还没有返回结果,但是这时候T2过来请求更新了

  • 这个流程应该是: T1运行加共享锁、T2运行、发现T1未完成等待其完成、T1完成、T2开始执行

  • T2之所以要等待,是因为T2执行更新的时候需要给表加排他锁,但是数据库规定,不能在同一资源上同时共存这两种锁,所以T2必须等T1执行完,释放锁后,才可以正常操作

T1: select * from 表名 lock in share mode //假设还未返回结果

T2: update 表名 set name='autofelix'

六、共享锁的实际应用

  • 如果T1和T2都是执行的查询,也就是都加共享锁

  • 这时候就不用等待,可以立马执行

  • 因为同一资源上可以同时存在多个共享锁,也被称为,共享锁与共享锁兼容

  • 意味着共享锁不阻止其他人同时读取资源,但是阻止其他人修改资源

T1: select * from table lock in share mode

T2: select * from table lock in share mode

七、死锁的发生

  • 假设T1和T2都同时执行2个资源操作,分别是查询和更新数据

  • 假设T1和T2同时达到select,T1对表加共享锁,而T2也加上了共享锁

  • 当T1的select执行完毕,准备执行update时

  • 根据锁机制,T1的共享锁必须升级到排他锁才可以执行接下来的update操作

  • 在升级排他锁之前,必须等T2的共享锁释放,同理,T2也在等T1的共享锁释放

  • 于是都在等待对方的锁释放,导致程序卡死,这种情况就是死锁

T1: 开启事务,执行查询更新两个操作

     select * from table lock in share mode

     update table set column1='hello'

T2: 开启事务,执行查询更新两个操作

     select * from table lock in share mode

     update table set column1='world'

八、另一种发生死锁的情景

  • 当T1和T2都是只执行更新语句的时候

  • 如下程序所示,这种语句非常的常见,很多人觉得他会产生死锁,其实要看情况

  • 如果id是主键,由于主键机制,并不需要全表扫描,直接可以更新当前数据,所以不会产生死锁

  • 如果id是普通字段,那么当T1加上排他锁之后,T2为了找到id=20条数据,必须进行全表扫描,当他扫到第10条的时候,发现这里有排他锁,导致全表扫描进行不下去,就会导致等待

T1: begin
     update table set content='hello' where id=10

T2: begin
     update table set content='world' where id=20

九、死锁的解决方式

  • 就是让T1和T2顺序执行,比如T1在执行完select后,立马给自身加上排他锁,这样T2不得不等待T1执行完才能继续

  • 但是如果有很多请求过来的话,都必须等待,这对用户特别的不友好

  • 所以,某些数据库引入了另一种方式,叫做更新锁,这里mysql除外,不存在更新锁

  • 更新锁其实就是排他锁的另一种实现,只是他允许其他人读的同时加共享锁,但是不允许其他操作,除非释放了更新锁

  • 流程大概如此: T1执行完select加上更新锁,T2执行查询完,准备加更新锁,发现已经有了,就等待,其他请求过来,如果查询是不受影响的,但是更新才等待

  • 这相比上面的查询也要等待增加了效率

T1: begin

     select * from table for update

     update table set content='hello'

T2: begin

     select * from table for update

     update table set content='world'
T1: begin

     select * from table [加更新锁操作]

     update table set content='hello'

T2: begin

     select * from table [加更新锁操作]

     update table set content='world'

十、意向锁和计划锁

  • 计划锁与程序猿无关,不需要了解

  • 意向锁,Innodb特有,分为意向共享锁和意向排他锁

  • 意向共享锁: 表示事务获取共享锁时,必须先得获取该表的意向共享锁

  • 意向排他锁: 表示事务获取排他锁时,必须先得获取该表的意向排他锁

  • 我们知道要对整个表加锁,必须保证表内不存在任何锁

  • 如果一行行的去检查是否加锁,效率必然极低,这时候可以检测意向锁是否被占用即可

十一、乐观锁和悲观锁

  • 乐观锁和悲观锁都是针对select而言的

  • 比如在商品抢购中,用户购买后库存需要减1,而很多用户同时购买时,读出来的库存数量一样,然后多个用户同时用该库存去减1

  • 这种做法必然会出现很大的漏洞,如果向在淘宝,京东出现这种情况,你就可以打包回家种地了

  • 这种情况如何解决呢,其实可以使用悲观锁进行解决,说白了也就是排他锁

  • 用户进来查库存的时候,就加上排他锁,等他所有操作完成后,再释放排他锁,让其他人进来

  • 不让用户等待,就可以使用乐观锁方式解决,乐观锁一般靠表的设计和时间戳来实现

  • 一般是在表中添加version或者timestamp时间戳字段

  • 这样就会保证如果更新失败,就表示有其他程序更新了数据库,就可以通过重试解决

update table set num=num-1 where id=10 and version=12

感谢各位的阅读,以上就是“Mysql中锁的使用场景是什么”的内容了,经过本文的学习后,相信大家对Mysql中锁的使用场景是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mysql中锁的使用场景是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL锁机制及应用场景是什么

本文小编为大家详细介绍“MySQL锁机制及应用场景是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL锁机制及应用场景是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。锁的概述MySQL锁是操作My
2023-07-05

Redis的使用场景是什么

这篇文章主要介绍“Redis的使用场景是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis的使用场景是什么”文章能帮助大家解决问题。Redis常用命令总结:包括时间复杂度总结与具体数据类型
2023-06-02

java中@Configuration使用场景是什么

这篇文章主要讲解了“java中@Configuration使用场景是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中@Configuration使用场景是什么”吧!一、简单介绍@
2023-07-05

RabbitMQ使用场景是什么

这篇文章主要介绍“RabbitMQ使用场景是什么”,在日常操作中,相信很多人在RabbitMQ使用场景是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”RabbitMQ使用场景是什么”的疑惑有所帮助!接下来
2023-06-26

mysql乐观锁使用的场景有哪些

乐观锁通常在以下场景中应用:并发读取:多个用户可以同时读取同一数据,不会产生冲突。并发更新:多个用户可以同时读取同一数据,但只有一个用户可以成功更新数据。数据量大:当数据量较大时,使用乐观锁可以减少数据库的锁定时间,提高性能。业务场景
mysql乐观锁使用的场景有哪些
2024-03-15

java SPI的使用场景是什么

本文小编为大家详细介绍“java SPI的使用场景是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“java SPI的使用场景是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概念1、SPI是服务提供界面,
2023-06-30

mysql悲观锁的使用场景有哪些

高并发更新操作:当有多个用户同时对同一行数据进行更新操作时,为了避免数据冲突和丢失,可以使用悲观锁来保证数据的一致性。数据库事务:在数据库事务中,为了确保事务的完整性和一致性,可以使用悲观锁来锁定需要操作的数据,防止其他事务对数据进行并发修
mysql悲观锁的使用场景有哪些
2024-05-08

分析MySQL锁的适用场景

MySQL 锁的应用场景分析在开发应用程序时,常常需要对数据库进行读取和写入操作。然而,当多个用户同时对数据库进行操作时,就会出现并发访问的问题。为了保证数据的一致性和完整性,MySQL 提供了锁机制来控制对数据库的并发操作。本文将分析 M
分析MySQL锁的适用场景
2023-12-21

vue使用slot的场景是什么

这篇文章主要介绍“vue使用slot的场景是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue使用slot的场景是什么”文章能帮助大家解决问题。使用场景:通过slot(插槽)可以让用户可以拓展
2023-07-05

mysql分区的应用场景是什么

本篇内容介绍了“mysql分区的应用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明1、最佳场景数据的时间序列性较强,则可按时间
2023-06-20

Golang error使用场景是什么

本篇内容主要讲解“Golang error使用场景是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang error使用场景是什么”吧!在Go的编程中, error的使用场景数不胜数,
2023-07-05

Go中sync包Cond使用场景是什么

本篇内容介绍了“Go中sync包Cond使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景编写代码过程中, 通常有主协程和多个
2023-07-05

Confd和Consul使用场景是什么

这篇文章主要介绍了Confd和Consul使用场景是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Confd和Consul使用场景是什么文章都会有所收获,下面我们一起来看看吧。Confd和Consul是什么
2023-07-05

React中memo、useCallback和useMemo的使用场景是什么

这篇“React中memo、useCallback和useMemo的使用场景是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这
2023-07-05

Golang高并发场景中的锁管理策略是什么?

锁管理策略提升 golang 高并发性能锁类型: 互斥锁(mutex),读写锁(rwmutex),原子操作最佳实践:最小化锁的粒度避免死锁使用读写锁使用原子操作实战案例: 使用互斥锁保护银行账户余额的修改操作性能优化:使用 sync.poo
Golang高并发场景中的锁管理策略是什么?
2024-05-10

Spring @Bean注解的使用场景是什么

本篇内容介绍了“Spring @Bean注解的使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简单介绍翻看Spring的源码
2023-07-05

ThreadLocal的原理和使用场景是什么

ThreadLocal是Java中的一个类,用于在多线程环境中实现线程内部的数据共享。它提供了一个线程局部变量,每个线程都可以独立地改变该变量的值,而不会影响其他线程的该变量的值。ThreadLocal的原理是通过为每个线程创建一个独立的变
2023-09-12

一文搞懂Mysql中的共享锁、排他锁、悲观锁、乐观锁及使用场景

目录一、常见锁类型二、mysql引擎介绍三、常用引擎间的区别 四、共享锁与排他锁五、排他锁的实际应用六、共享锁的实际应用七、死锁的发生八、另一种发生死锁的情景九、死锁的解决方式十、意向锁和计划锁十一、乐观锁和悲观锁总结一、常见锁类型表级锁
2022-07-04

编程热搜

目录