首页 > 数据库 >详解mysql的for update

详解mysql的for update

时间:2024-09-25 10:24:20浏览次数:1  
标签:update 主键 foods 详解 mysql WHERE id SELECT

前言

近期开发与钱相关的项目,在高并发场景下对数据的准确行有很高的要求,用到了for update,故总结一波以便日后留恋。

本文讲解几个点:
1.for update的使用场景
2.for update如何使用
3.for update的锁表
4.for update的注意点
5.for update的疑问点

for update的使用场景

如果遇到存在高并发并且对于数据的准确性很有要求的场景,是需要了解和使用for update的。

比如涉及到金钱、库存等。一般这些操作都是很长一串并且是开启事务的。如果库存刚开始读的时候是1,而立马另一个进程进行了update将库存更新为0了,而事务还没有结束,会将错的数据一直执行下去,就会有问题。所以需要for upate 进行数据加锁防止高并发时候数据出错。

记住一个原则:一锁二判三更新

for update如何使用


使用姿势:

select * from table where xxx for update
1
for update的锁表
InnoDB默认是行级别的锁,当有明确指定的主键时候,是行级锁。否则是表级别。

例子: 假设表foods ,存在有id跟name、status三个字段,id是主键,status有索引。

例1: (明确指定主键,并且有此记录,行级锁)
SELECT * FROM foods WHERE id=1 FOR UPDATE;
SELECT * FROM foods WHERE id=1 and name=‘咖啡色的羊驼’ FOR UPDATE;

例2: (明确指定主键/索引,若查无此记录,无锁)
SELECT * FROM foods WHERE id=-1 FOR UPDATE;

例3: (无主键/索引,表级锁)
SELECT * FROM foods WHERE name=‘咖啡色的羊驼’ FOR UPDATE;

例4: (主键/索引不明确,表级锁)
SELECT * FROM foods WHERE id<>‘3’ FOR UPDATE;
SELECT * FROM foods WHERE id LIKE ‘3’ FOR UPDATE;

for update的注意点


1.for update 仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。

2.要测试for update的锁表情况,可以利用MySQL的Command Mode,开启二个视窗来做测试。

for update的疑问点


当开启一个事务进行for update的时候,另一个事务也有for update的时候会一直等着,直到第一个事务结束吗?

答:会的。除非第一个事务commit或者rollback或者断开连接,第二个事务会立马拿到锁进行后面操作。

如果没查到记录会锁表吗?

答:会的。表级锁时,不管是否查询到记录,都会锁定表。

 


————————————————
版权声明:本文为CSDN博主「咖啡色的羊驼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011957758/article/details/75212222

标签:update,主键,foods,详解,mysql,WHERE,id,SELECT
From: https://www.cnblogs.com/ILoveJackSparrow/p/18430803

相关文章

  • 简单说说MySQL中 SELECT 语句执行流程
    流程讲解MySQL中SELECT语句的执行流程分为多个步骤,通常从用户发出查询请求到MySQL返回结果包含以下过程:客户端/服务器通信:用户向MySQL服务器发送SELECT查询语句。查询解析(Parser):MySQL收到SQL语句后,会将查询语句进行词法和语法分析。词法分析器将SQL语句拆解为关键......
  • 神经网络之卷积篇:详解为什么使用卷积?(Why convolutions?)
    详解为什么使用卷积?来分析一下卷积在神经网络中如此受用的原因,然后对如何整合这些卷积,如何通过一个标注过的训练集训练卷积神经网络做个简单概括。和只用全连接层相比,卷积层的两个主要优势在于参数共享和稀疏连接,举例说明一下。假设有一张32×32×3维度的图片,假设用了6个大小为......
  • OpenCV_图像的平滑处理详解
    图像平滑处理是图像处理中的一种技术,旨在减少图像中的噪声和细节,从而使图像看起来更平滑。平滑处理可以帮助改善图像质量,去除噪声,并在进一步的图像分析和处理步骤中提供更清晰的数据。常见的平滑处理技术包括滤波、模糊等。例如,下图1是含有噪声的图像,在图像内存在噪声信息,我们......
  • OpenCV_自定义线性滤波(filter2D)应用详解
    OpenCVfilter2D将图像与内核进行卷积,将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时,该函数根据指定的边界模式插值异常像素值。卷积核本质上是一个固定大小的系数数组,数组中的某个元素被作为锚点(一般是数组的中心)。上面讲了线性滤波的实质就是计算相......
  • Elasticsearch7.7修改network.host IP地址 start启动失败及Elasticsearch7的配置项详
    一、Elasticsearch7.7修改network.hostIP地址start启动失败    使用的是最新的Elasticsearch7.7版本,启动后默认是绑到127.0.0.1上的,这肯定不是我们需要的,所以修改配置文件将network.host配置选改成我们的服务器局域网IP地址。Elasticsearch7.7版本安装后配置文件elastic......
  • Windows 10 on ARM, version 22H2 (updated Sep 2024) ARM64 AArch64 中文版、英文版
    Windows10onARM,version22H2(updatedSep2024)ARM64AArch64中文版、英文版下载基于ARM的Windows10请访问原文链接:https://sysin.org/blog/windows-10-arm/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindows10,version22H2(releasedNov2021)......
  • 如果值达到 800,如何创建 MySQL 函数来更新数据库?
    我试图让数据库每秒检查一次表,看看XP值是否达到800,如果达到,则将排名值设置为“EliteGenin”并将XP值设置为0。@bot.eventasyncdefon_message(message):guild=message.guild.idtable="PEOPLE_"+str(guild)try:connection=mysql.conn......
  • 【C++】STL详解之string类
    本次内容大纲:什么是STLSTL(standardtemplatelibaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本原始版本AlexanderStepanov、MengLee在惠普实验室完成的原始版本,本着开源精神,他们声明允许任......
  • MySQL 中存储过程参数的设置与使用
    在MySQL数据库中,存储过程是一组预先编译好的SQL语句集合,可以接受参数并返回结果。使用存储过程可以提高数据库的性能和可维护性,同时也可以减少网络流量和代码重复。那么,如何在MySQL中设置和使用存储过程的参数呢?本文将为你详细介绍。一、存储过程参数的类型在MySQL中,存储......
  • MySQL 缓冲池管理与常见优化技巧
    在MySQL数据库的性能优化中,缓冲池的管理至关重要。同时,了解其他常见的优化技巧也能极大地提升数据库的运行效率。今天,我们就来深入探讨在MySQL中如何管理并调整缓冲池的大小,以及一些常见的优化技巧。一、缓冲池的重要性MySQL的缓冲池(BufferPool)是内存中的一块区域,用于缓存......