Mysql锁及适用场景

news2024/12/28 19:49:11

一、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. 灵活性和可扩展性: 使用分布式锁可以更灵活地控制锁的获取和释放逻辑,同时也更容易实现锁的超时、自动续期等功能,满足不同业务场景的需求。此外,分布式锁的架构也更具扩展性,便于水平扩展和集群部署。

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

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

相关文章

Matlab|基于模型预测控制(MPC)的微电网调度优化的研究

目录 1 主要内容 2 程序难点及问题说明 3 部分程序 4 下载链接 1 主要内容 该程序分为两部分,日前优化部分——该程序首先根据《电力系统云储能研究框架与基础模型》上面方法,根据每个居民的实际需要得到响应储能充放电功率,优化得到整…

网络通信VLAN学习篇

拓扑图 如上图,pc3,pc5同一网络,pc4,pc6同一网络,vlan的划分就是虚拟局域网,局域网的理解就是同一vlan下的设备可以相互通信,不同vlan不可以通信(通过三层交换机可以实现通信的&…

一分钟学习Markdown语法

title: 一分钟学习Markdown语法 date: 2024/3/24 19:33:29 updated: 2024/3/24 19:33:29 tags: MD语法文本样式列表结构链接插入图片展示练习实践链接问题 欢迎来到Markdown语法的世界!Markdown是一种简单而直观的标记语言,让文本排版变得轻松有趣。接下…

RK3568驱动指南|第十三篇 输入子系统-第154章 固定usb设备的设备节点实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Linux调试器-gdb

一、背景 程序的发布方式有两种,debug模式和release模式 debug模式:编译器形成可执行程序的时候会给可执行程序添加调试信息 程序员调试时使用debug模式,而release模式用于测试 而gcc/g默认编译,采用release模式 用gcc/g使用…

windows11 openssh服务开启;第三方ping不通局域网windows电脑;ssh连接内部ubuntu系统

参考:https://blog.csdn.net/2301_77554343/article/details/134328867 1、windows11 openssh开启 1)我这边可选功能在设置-系统里面;其他网上看在应用下;添加可选openssh服务器安装 2)安装后打开,管理员…

Python对文件的常见操作用法

在 Python 中,操作文件通常涉及打开文件、读取内容、写入内容以及关闭文件等步骤。下面是一些常见的文件操作及其示例: 1. 打开文件 使用内置的 open() 函数来打开文件。这个函数接受两个主要参数:文件名和模式。模式指定了文件应如何打开&a…

前端-html-01

1.HTML的标签分类 1.1常用排版标签 标签名语义和功能属性单标签还是双标签h1 ~ h6一级标题~六级标题无双标签p段落无双标签hr分隔线无单标签br换行无单标签pre原格式显示无双标签div无语义&#xff0c;用于页面布局无双标签 1.1.1h标题标签 <!DOCTYPE html> <htm…

nav仿真(2)

开启仿真和建图 打开第一个窗口启动仿真&#xff1a; source devel/setup.bash export TURTLEBOT3_MODELburger roslaunch turtlebot3_gazebo turtlebot3_world.launch # 启动仿真打开第二个窗口&#xff0c;开始建图&#xff1a; source devel/setup.bash export TURTLEBOT3_…

Nginx 内存池

目录 零、基本框架 一、基础结构 二、对外接口 三、函数实现 1、ngx_create_pool 2、ngx_destroy_pool 3、ngx_reset_pool 4、ngx_palloc 5、ngx_pnalloc 6、ngx_pmemalign 7、ngx_pfree 8、ngx_pcalloc 9、ngx_pool_cleanup_add 10、ngx_pool_run_cleanup_file…

【spring】@Component注解学习

Component介绍 Component 是 Spring 框架中的一个注解&#xff0c;用于将一个类标记为 Spring 上下文中的一个组件。当一个类被标记为 Component 时&#xff0c;Spring 容器会在启动时自动扫描并实例化这个类&#xff0c;并将其注册到 Spring 上下文中。 Component 注解可以用…

Gorm连接Mysql数据库及其语法

Gorm连接Mysql数据库及其语法 文章目录 Gorm连接Mysql数据库及其语法前期工作找到Gorm的github项目简单了解相关MySQL语法 启动数据库定义数据库模型注意点Gorm Model定义结构体标签(tag)支持的结构体标记&#xff08;Struct tags&#xff09;关联相关标记&#xff08;tags&…

Facebook如何使用增强技术提升广告效果?

AR in AD - case study 脸书2021年宣布了引入AR的新方法&#xff0c;以推动其应用套件中的产品发现和购买。但他们首先考虑是技术。据脸书称&#xff0c;技术一直是增强现实在其应用程序中更广泛使用的主要障碍。这就是为什么它现在正在做出改变&#xff0c;使企业主和广告商更…

DFS进阶——全排列

通过后续的题目希望大家明白&#xff0c;dfs不仅仅是对图的遍历&#xff0c;他还有很多用法。 DFS进阶1——回溯 先说一下回溯的板子 dfs(){ for(......){标记信息dfs()撤销标记 } }回溯模板——递归实现排列型枚举 题目分析 其实就是对1~n的数字全排列&#xff0c;这里就…

【JavaScript】JavaScript 程序流程控制 ⑥ ( while 循环概念 | while 循环语法结构 )

文章目录 一、while 循环1、while 循环概念2、while 循环语法结构 二、while 循环 - 代码示例1、打印数字2、计算 1 - 10 之和 一、while 循环 1、while 循环概念 在 JavaScript 中 , while 循环 是一种 " 循环控制语句 " , 使用该语句就可以 重复执行一段代码块 , …

Java项目:75 springboot房产销售系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 使用房产销售系统分为管理员和用户、销售经理三个角色的权限子模块。 管理员所能使用的功能主要有&#xff1a;首页、个人中心、用户管理、销售经理管…

MRC是谁?- 媒体评级委员会 Media Rating Council

在在线广告的世界里&#xff0c;有许多不同的技术和实践用于提供和衡量广告。对于广告商、出版商和营销人员来说&#xff0c;了解这些技术是如何工作的以及如何有效使用这些技术很重要。在这方面发挥关键作用的一个组织是媒体评级委员会&#xff08;MRC&#xff09;。 1. 了解…

OpenCV 形态学处理函数

四、形态学处理&#xff08;膨胀&#xff0c;腐蚀&#xff0c;开闭运算&#xff09;_getstructuringelement()函数作用-CSDN博客 数字图像处理(c opencv)&#xff1a;形态学图像处理-morphologyEx函数实现腐蚀膨胀、开闭运算、击中-击不中变换、形态学梯度、顶帽黑帽变换 - 知乎…

Java代码基础算法练习-搬砖问题-2024.03.25

任务描述&#xff1a; m块砖&#xff0c;n人搬&#xff0c;男搬4&#xff0c;女搬3&#xff0c;两个小孩抬一砖&#xff0c;要求一次全搬完&#xff0c;问男、 女、小孩各若干&#xff1f; 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.S…

leetcode刷题日记-外观数组

题目描述 解题思路 初始化字符串 init 为 “1”&#xff0c;作为外观数列的第一项。 通过循环迭代生成外观数列的下一项&#xff0c;循环次数为 n-1&#xff0c;因为已经初始化了第一项。 在每次迭代中&#xff0c;通过两个指针 pos 和 start 来遍历当前项 init&#xff0c;po…