MySQL的锁机制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL的锁机制主要用于管理并发事务对数据的一致性和完整性的访问控制

MySQL的锁机制主要用于管理并发事务对数据的一致性和完整性的访问控制,主要分为以下几种类型:

1.行级锁

行级锁是MySQL中锁定粒度最细的锁,只针对当前操作的行进行加锁。

优点在于开销小、并发性能高,适用于InnoDB存储引擎。

InnoDB支持两种行级锁:共享锁(S锁,也叫读锁),多个事务可以同时获得同一数据行的共享锁;排他锁(X锁,也叫写锁),一个事务对某一行加上了排他锁后,其他事务不能再对该行加任何类型的锁。

2.表级锁

表级锁是对整个数据表进行加锁,MyISAM存储引擎默认使用的就是表级锁。

表级锁的开销小,加锁快,但锁定粒度大,发生锁冲突的概率相对较大,并发性能较差。

包括读锁(共享锁)和写锁(排他锁),在MyISAM中,一个表只能有一个写锁,但可以有多个读锁。

3.乐观锁与悲观锁

       在 MySQL 中,乐观锁和悲观锁是两种处理并发访问的不同策略。

       乐观锁(Optimistic Locking):

       乐观锁假设在大多数情况下,数据不会发生冲突,因此在读取数据时不会加锁。当要更新数据时,它会检查在读取数据后是否有其他事务对数据进行了修改。通常,乐观锁会使用版本号或时间戳等机制来检查数据是否被修改。

       悲观锁(Pessimistic Locking)

       悲观锁则是假设数据在大多数情况下会发生冲突,因此在读取数据时会加锁,直到事务完成后才会释放锁。悲观锁适用于并发写入较多的场景,但是会增加系统开销并可能降低并发性能。

说明:

InnoDB的行级锁:InnoDB存储引擎支持行级锁,这是为了支持高并发的读写操作。行级锁可以最大限度地减少锁竞争,提高并发性能。

死锁:当两个或多个事务相互等待对方释放资源时,就会发生死锁。InnoDB有一个死锁检测机制,当检测到死锁时,它会主动回滚其中一个事务,从而解决死锁。

记录锁:锁定单个行记录。

间隙锁:锁定一个范围,但不包括记录本身。这主要用于防止幻读。

Next-Key 锁:是记录锁和间隙锁的组合,锁定一个范围并包括记录本身。

锁升级

       在某些情况下,为了避免死锁或提高性能,数据库可能会决定升级锁,例如从行级锁升级到表级锁。

锁的粒度

       锁的粒度指的是锁所覆盖的数据范围。例如,表级锁的粒度是整个表,而行级锁的粒度是表中的单个行。

       在实际开发中,为了保证数据一致性,我们需要根据业务场景合理选择合适的锁策略,避免长时间持有不必要的锁,减少锁等待和死锁的发生。例如,在进行更新或者删除操作时,尽量通过主键或唯一索引进行条件查询并获取行锁,以提高并发处理能力。

     另外,选择乐观锁还是悲观锁取决于数据访问的模式、应用的并发情况以及对性能的要求。通常情况下,如果并发冲突较少,乐观锁是一个较好的选择,因为它不会阻塞其他事务;而如果并发冲突较多,悲观锁可能更适合,因为它可以确保数据的一致性。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
关系型数据库 MySQL 数据库
【MySQL实战笔记】 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?-01
【4月更文挑战第17天】MySQL的锁分为全局锁、表级锁和行锁。全局锁用于全库备份,可能导致业务暂停或主从延迟。不加锁备份会导致逻辑不一致。推荐使用`FTWRL`而非`readonly=true`因后者可能影响其他逻辑且异常处理不同。表级锁如`lock tables`限制读写并限定操作对象,常用于并发控制。元数据锁(MDL)在访问表时自动加锁,确保读写正确性。
70 31
|
3天前
|
关系型数据库 MySQL 数据库
MySQL的行级锁锁的到底是什么?
本文简述了InnoDB的行级锁机制,包括记录锁、间隙锁和Next-Key锁。记录锁锁定索引记录,防止其他事务对相同值的行进行操作;间隙锁锁定索引记录间的间隙,防止插入。Next-Key锁是两者的结合,锁定记录及其前后间隙。在可重复读(RR)隔离级别下,加锁策略涉及Next-Key锁,但会因查询条件退化为行锁或间隙锁。MySQL的加锁机制遵循两个原则和两个优化,例如唯一索引等值查询时退化为行锁。RR级别虽能防止幻读,但也可能降低并发并引发死锁,因此有些场景下会选择读已提交(RC)级别。
MySQL的行级锁锁的到底是什么?
|
3天前
|
存储 算法 关系型数据库
MySQL事务与锁,看这一篇就够了!
MySQL事务与锁,看这一篇就够了!
|
3天前
|
存储 关系型数据库 MySQL
MySQL数据库锁定机制
MySQL数据库锁定机制
12 0
|
3天前
|
存储 SQL 关系型数据库
|
3天前
|
关系型数据库 MySQL 数据库
MySQL锁解密:读锁与写锁
【4月更文挑战第20天】
24 1
|
3天前
|
关系型数据库 MySQL 数据库
|
3天前
|
算法 关系型数据库 MySQL
|
3天前
|
SQL 关系型数据库 MySQL
MySQL锁:解析隐式锁与显式锁
【4月更文挑战第20天】
40 0
|
3天前
|
关系型数据库 MySQL 数据库