Mysql锁及适用场景

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Mysql锁及适用场景

一、mysql中的锁有哪些?

1.1 锁的类型

(1)共享锁(Shared Lock): 共享锁允许事务读取数据,但不允许其他事务修改数据。多个事务可以同时持有共享锁。

-- 事务A获取共享锁
START TRANSACTION;
SELECT * FROM table_name WHERE column_name = 'value' LOCK IN SHARE MODE;
 
-- 事务B也可以获取共享锁
START TRANSACTION;
SELECT * FROM table_name WHERE column_name = 'value' LOCK IN SHARE MODE;

(2)排他锁(Exclusive Lock): 排他锁用于写操作,只有一个事务能持有排他锁,其他事务无法同时持有共享锁或排他锁。

-- 事务A获取排他锁
START TRANSACTION;
UPDATE table_name SET column_name = 'new_value' WHERE id = 1 FOR UPDATE;
 
-- 事务B无法获取排他锁,需等待事务A释放锁
START TRANSACTION;
UPDATE table_name SET column_name = 'another_value' WHERE id = 1 FOR UPDATE;

1.2 锁的级别

(1)行级锁(Row Lock): 行级锁针对数据表中的行进行加锁,可以减少并发操作产生的锁冲突。

-- 事务A获取行级锁
START TRANSACTION;
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
 
-- 事务B也可以获取行级锁,但针对不同行
START TRANSACTION;
SELECT * FROM table_name WHERE id = 2 FOR UPDATE;

(2)表级锁(Table Lock): 表级锁对整个表进行加锁,会限制其他事务对表的操作。

-- 事务A获取表级锁
LOCK TABLES table_name WRITE;
 
-- 事务B无法同时获取表级锁,需等待事务A释放锁
LOCK TABLES table_name READ;

二、哪些实际业务场景下,我们会在代码中用到mysql的锁?

  1. 简单事务控制: 对于一些简单的事务控制场景,例如在单个数据库事务中需要确保某些数据的完整性和一致性时,可以直接在 SQL 中增加排他锁来实现。这样做既简单又直接,避免引入额外的复杂性。
  2. 低并发情况: 如果业务场景下并发访问量不高,或者不需要跨服务或跨实例进行加锁操作,直接在 SQL 中增加排他锁可能会更加轻量和直观,不需要引入额外的分布式系统组件。
  3. 数据库专用功能: 有些数据库系统提供了特定的排他锁机制,并且对于特定的业务场景,这些数据库专用的排他锁功能可能更加适用和高效。
  4. 特定的数据操作: 在某些需要对整个表或某些数据范围进行原子操作的情况下,直接在 SQL 中增加排他锁可能更加方便和可行,特别是针对较小规模的数据操作。

三、实际的业务场景是在电商系统中处理订单库存扣减操作。当多个用户同时下单购买同一商品时,需要确保库存扣减的原子性和数据的一致性。适合用Mysql的锁还是Redis加分布式锁,为什么?

在实际订单库存扣减的业务场景中,使用分布式锁(如 Redis 分布式锁)比直接在 SQL 中增加排他锁更好的主要原因有以下几点:

  1. 跨服务支持: 如果订单库存扣减的业务涉及到多个服务或多个实例,使用分布式锁可以跨服务地实现对共享资源(库存数据)的加锁操作,确保不同服务之间的并发访问问题。
  2. 细粒度控制: 分布式锁可以实现更细粒度的控制,例如针对每个商品ID进行加锁,而不是一次性锁住整个表或某个范围的数据,从而提高并发性能。
  3. 避免数据库负担: 直接在 SQL 中增加排他锁可能会给数据库带来额外的负担,特别是在高并发的情况下,容易造成数据库性能瓶颈。通过采用分布式锁,可以将部分锁操作转移到 Redis 等缓存中,减轻数据库压力。
  4. 灵活性和可扩展性: 使用分布式锁可以更灵活地控制锁的获取和释放逻辑,同时也更容易实现锁的超时、自动续期等功能,满足不同业务场景的需求。此外,分布式锁的架构也更具扩展性,便于水平扩展和集群部署。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
安全 关系型数据库 MySQL
MySQL数据库高效秘籍:10个小技巧,让你轻松应对各种场景!
【8月更文挑战第25天】本文介绍了十个提升MySQL数据库效率与安全性的实用技巧。涵盖查询性能分析、索引优化、慢查询日志利用、图形化工具如MySQL Workbench的应用、性能分析工具、主从复制实现、备份与恢复策略、数据库迁移方法及安全性保障等多个方面。通过具体的示例代码展示每个技巧的实际操作方式,帮助读者深入理解并有效运用MySQL数据库。
231 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL 锁
MySQL里常见的几种锁
57 3
|
2月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
2月前
|
存储 关系型数据库 MySQL
MySQL在企业内部应用场景有哪些
【10月更文挑战第17天】MySQL在企业内部应用场景有哪些
71 0
|
2月前
|
存储 关系型数据库 MySQL
介绍一下MySQL的一些应用场景
【10月更文挑战第17天】介绍一下MySQL的一些应用场景
275 0
|
2月前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
113 1
|
3月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
490 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
2月前
|
关系型数据库 MySQL Java
MySQL数据锁:Record Lock,Gap Lock 和 Next-Key Lock
本文基于 MySQL 8.0.30 版本及 InnoDB 引擎,深入解析三种行锁机制:记录锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-key Lock)。记录锁锁定索引记录,确保事务唯一修改;间隙锁锁定索引间的间隙,防止新记录插入;临键锁结合两者,锁定范围并记录自身,有效避免幻读现象。通过具体示例展示了不同锁的作用机制及其在并发控制中的应用。
221 2
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
88 1
|
3月前
|
监控 关系型数据库 MySQL
MySQL锁机制与解决死锁问题
MySQL锁机制与解决死锁问题
337 5