mysql锁及锁出现总结

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: mysql锁及锁出现总结

转载请注明出处:

1.按锁粒度分类:

  1. 行锁:锁某行数据,锁粒度最小,并发度高;; 行锁是指加锁的时候锁住的是表的某一行或多行记录,多个事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问; 行锁是对所有行级别锁的一个统称,比如下面说的记录锁、间隙锁、临键锁都是属于行锁
  2. 表锁:锁整张表,锁粒度最大,并发度低; 上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才能进行对表进行访问;
  3. 间隙锁:锁的是一个区间

1.1什么情况会出现表锁

MySQL中的表锁主要是为了解决一些特殊情况下的并发问题而引入的,比如:

  1. ALTER TABLE操作:在执行ALTER TABLE操作时,MySQL会获取一个排它锁,防止其他事务对该表进行读写操作;
  2. 大事务操作:如果一个事务中包含大量的数据操作,比如更新或删除大量数据,那么MySQL会自动将该事务的隔离级别提升为SERIALIZABLE,也就是串行化,此时会对涉及到的所有表进行锁定,避免其他事务对该表的并发操作;
  3. 锁冲突较多:如果系统中存在较多的锁冲突,比如同一个表上有多个事务争夺同一个行锁或排它锁时,MySQL会自动将该表的锁级别提升为表锁,避免锁冲突的出现,提高系统的性能。 需要注意的是,表锁是对整张表进行锁定,因此会对其他事务的并发操作产生较大的影响,会导致系统的响应时间变慢,降低系统的并发性能。因此,在实际应用中,应该尽量避免使用表锁,而是采用行锁或其他更细粒度的锁机制来保证数据的一致性和并发性。

1.2什么情况会出现行锁

  MySQL中的行锁主要是为了保证并发读写的一致性而引入的,当多个事务同时对同一行进行读写操作时,MySQL就会自动对该行进行行级别的锁定,以保证数据的一致性。具体来说,会出现以下情况:

  1. UPDATE和DELETE操作:当使用UPDATE或DELETE语句更新或删除表中的某行数据时,MySQL会自动对该行进行排它锁定,避免其他事务同时对该行进行操作;
  2. INSERT操作:当使用INSERT语句插入新数据时,MySQL会自动对新插入的行进行共享锁定,避免其他事务对该行进行写操作;
  3. 查询操作:当使用SELECT ... FOR UPDATE语句进行查询时,MySQL会对查询结果所涉及到的所有行进行排它锁定,避免其他事务同时对该行进行操作;
  4. 锁冲突:当多个事务同时对同一行进行操作时,会产生锁冲突,此时MySQL会自动对该行进行行级别的锁定,以保证数据的一致性。 需要注意的是,行锁是对单行数据进行锁定,因此对系统的并发性能影响较小,但是在高并发和大数据量的情况下,可能会出现死锁和锁等待等问题,因此在实际应用中需要注意锁的细粒度和锁的使用场景,以避免出现性能问题。

1.3什么时候会出现间隙锁

  MySQL中的间隙锁是一种特殊的行锁,用于保证索引的一致性和避免幻读现象的出现。当执行范围查询操作时,MySQL会对查询范围内的所有行进行锁定,同时还会对查询范围之间的空隙或未被查询到的行进行间隙锁定,以保证数据的一致性。具体来说,会出现以下情况:

  1. 事务A向表中插入一行数据,此时MySQL会对该行进行行锁定;
  2. 事务B在相同的索引值处插入一行数据,此时MySQL会对该行进行行锁定,并对索引值范围之间的空隙进行间隙锁定,避免事务C在该范围内插入数据;
  3. 事务C在索引值范围内插入一行数据,此时MySQL会被阻塞,直到事务A或事务B提交或回滚,释放行锁和间隙锁,以避免幻读现象的出现。 需要注意的是,间隙锁会对系统的并发性能产生一定的影响,因此在实际应用中需要注意锁的细粒度和锁的使用场景,以避免出现性能问题。同时,在使用间隙锁时,需要注意锁的范围和锁的模式,以保证数据的一致性和并发性能。

2.按锁的作用范围分类

2.1 按锁的作用范围可以分为:

  • 乐观锁:并不会真正的去锁某行记录,而是通过一个版本号来实现的
  • 悲观锁:行锁、表锁等都是悲观锁

2.2 悲观锁

  (1) 概念 悲观锁,正如其名,具有强烈的独占和排他特性,每次去拿数据的时候都认为别人会修改,对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。

  (2) 应用场景 适用于并发量不大、写入操作比较频繁、数据一致性比较高的场景。但是由于需要频繁的加锁和解锁,可能会导致性能瓶颈。

  (3) 实现方式 在MySQL中使用悲观锁,必须关闭MySQL的自动提交,set autocommit=0。共享锁和排它锁是悲观锁的不同的实现,它俩都属于悲观锁的范畴。

    悲观锁的实现主要有两种方式:一种是使用SELECT ... FOR UPDATE语句,在读取数据时获得行级锁;另一种是使用SELECT ... LOCK IN SHARE MODE语句,在读取数据时获得共享锁。

  (4) 实战

  商品goods表中id,name,number分别代表商品ID,商品名称,商品库存。

2.3 乐观锁

  (1) 概念 乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。

  (2) 应用场景 适用于读多写少,因为如果出现大量的写操作,写冲突的可能性就会增大,业务层需要不断重试,会大大降低系统性能。

  (3) 实现方式

  乐观锁的实现主要有两种方式:一种是使用版本号,每个数据记录都有一个版本号,更新时需要比较版本号是否一致;另一种是使用CAS(Compare and Swap)操作,即比较并替换。

  版本比较的流程:一般使用数据版本(Version)记录机制实现,在数据库表中增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。

3.按锁的类型分类

3.1 按锁的类型分类

  • 共享锁(读锁):多个线程可以同时获取同一份数据的共享锁,读取数据但不能修改数据;
  • 排他锁(写锁):只允许一个线程获取排他锁,可以读取并修改数据。

3.2 共享锁

  共享锁(Shared Lock):共享锁是一种读锁,多个事务可以同时持有相同的共享锁,但是不能与排他锁同时存在。共享锁的主要作用是防止其他事务对数据进行修改,以保证事务的隔离性。在执行SELECT语句时,MySQL会自动加上共享锁,以避免其他事务对数据进行修改,但是不会阻塞其他事务的读取操作。

  实现方式:共享锁的实现方式是通过读锁实现的,即在读取数据时,使用LOCK IN SHARE MODE或SELECT ... FOR SHARE语句加上共享锁。

3.3 排它锁

  排他锁(Exclusive Lock):排他锁是一种写锁,一个事务持有排他锁时,其他事务不能持有共享锁或排他锁,以保证数据的独占性。在执行INSERT、UPDATE和DELETE等操作时,MySQL会自动加上排他锁,以避免其他事务对数据进行读取和修改。

  实现方式:排他锁的实现方式是通过写锁实现的,即在修改数据时,使用SELECT ... FOR UPDATE或UPDATE ... WHERE语句加上排他锁

 

 

 

标签: mysql

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
SQL 关系型数据库 MySQL
MySQL 锁
MySQL里常见的几种锁
34 3
|
1天前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
4 1
|
16天前
|
关系型数据库 MySQL Java
MySQL数据锁:Record Lock,Gap Lock 和 Next-Key Lock
本文基于 MySQL 8.0.30 版本及 InnoDB 引擎,深入解析三种行锁机制:记录锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-key Lock)。记录锁锁定索引记录,确保事务唯一修改;间隙锁锁定索引间的间隙,防止新记录插入;临键锁结合两者,锁定范围并记录自身,有效避免幻读现象。通过具体示例展示了不同锁的作用机制及其在并发控制中的应用。
45 2
|
16天前
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
9 1
|
1天前
|
存储 关系型数据库 MySQL
MySQL锁,锁的到底是什么?
【10月更文挑战第16天】MySQL 锁锁定的是与数据和资源相关的对象,其目的是为了保证数据的一致性、避免冲突,并在并发环境下合理协调事务或操作的执行。理解锁的对象和意义对于优化数据库性能、处理并发问题至关重要。
12 0
|
27天前
|
监控 关系型数据库 MySQL
MySQL锁机制与解决死锁问题
MySQL锁机制与解决死锁问题
134 5
|
3天前
|
关系型数据库 MySQL 数据库
mysql锁详解
通过理解并合理运用MySQL中的锁机制,开发者可以有效管理数据库并发访问,平衡性能与数据一致性需求。更多关于MySQL锁的深入探讨和最佳实践,请参考专业的数据库管理资源[[深入MySQL锁机制详解
7 0
|
1月前
|
关系型数据库 MySQL 数据库
Mysql的锁
本文介绍了MySQL中表级锁和行级锁的区别,其中MyISAM仅支持表级锁,而InnoDB支持表级锁和行级锁,默认为行级锁。表级锁锁定整个表,实现简单,资源消耗少,但并发度低;行级锁仅锁定相关记录,减少冲突,提高并发度,但加锁开销大。此外,还介绍了共享锁和排他锁的概念及意向锁的作用。
|
27天前
|
存储 SQL 关系型数据库
MySQL 的锁机制,那么多的锁,该怎么区分?
MySQL 的锁机制,那么多的锁,该怎么区分?
28 0
|
2月前
|
监控 关系型数据库 MySQL
在Linux中,mysql的innodb如何定位锁问题?
在Linux中,mysql的innodb如何定位锁问题?