MySQL for update锁表还是锁行校验

select * from user where id = 1 for update ;

1. for update作用

在MySQL中,使用for update子句可以对查询结果集进行行级锁定,以便在事务中对这些行进行更新或者防止其他事务对这些行进行修改。

当使用for update时,锁定行的方式取决于where中的字段是否具有索引,而不是唯一索引。如果where

条件中的字段具有索引(无论是普通索引还是唯一索引),MySQL将锁定与查询结果集匹配的行,如果where中的字段没有索引MySQL将锁表

2. 撸代码证明结果

创建一张表

其中id是主键,user_name建立索引

create table if not exists user
(id        int auto_increment comment '主键ID'primary key,user_name varchar(32) null comment '用户名',password  varchar(64) null comment '密码',phone     varchar(11) null comment '手机号'
);create index user_user_name_indexon test1.user (user_name);

插入三条数据

INSERT INTO user (id, user_name, password, phone) VALUES (1, '小明', '123', '13123920201');
INSERT INTO user (id, user_name, password, phone) VALUES (2, '小王', '1234', '13123920202');
INSERT INTO user (id, user_name, password, phone) VALUES (3, '小狗', '12345', '13123920203');

begin:表示开启一个事物

commit:表示提交事物

新开3个查询窗口

窗口1

begin;
select * from user where id = 1 for update ;
commit;

窗口2

begin;
select * from user where id = 1 for update ;
commit;

窗口3

begin;
select * from user where id = 2 for update ;
commit;

a. 查询带普唯一引字段

步骤1: 窗口1执行下面代码

begin;
select * from user where id = 1 for update ;

结果如下

img

这时id = 1的行应该被锁住了

步骤2: 窗口2执行下面代码

begin;
select * from user where id = 1 for update ;

结果如下,一直在等待

img

最后报锁超时错误

img

证明id = 1的行被锁住了

步骤3:

查询id=2的数据

begin;
select * from user where id = 2 for update ;

可以查到结果

img

说明select * from user where id = 1 for update ;只锁了id = 1的行,id = 2行没有被锁

步骤4:

窗口1执行下面代码

commit;

结果如下

img

窗口2再执行下面代码

begin;
select * from user where id = 1 for update ;

这时就可以查出结果来了

img

说明id = 1行锁被释放,窗口2就可以查到结果了

证明唯一索引锁行

b. 查询带普通索引字段

窗口1

begin;
select * from user where user_name = '小明' for update ;

img

窗口2

begin;
select * from user where user_name = '小王' for update ;

img

证明普通索引时锁行

c. 查询没索引字段

窗口1:

begin;
select * from user where phone = 13123920201 for update ;

img

窗口2:

begin;
select * from user where id = 2 for update ;

img

一直再查询

img

锁等待超时

证明没索引时锁表

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

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

相关文章

AI 智能体:探索自主智能的世界

AI 智能体:探索自主智能的世界 认真的飞速小软 飞速创软 2024-01-30 11:06 发表于新加坡 想象一下,在这样一个世界里,软件自身可以自主地与环境交互,根据收集的数据做出决策,并以最少的人工干预来执行任务。这些AI智能…

WPF 中 Loaded 和 Closing 窗口事件

在 WPF 中,Loaded 和 Closing 是两个常用的窗口事件。下面是对这两个事件的详细解释和示例说明: Loaded 事件: Loaded 事件在窗口(或其他可视元素)加载完成并准备好进行显示时触发。在 Loaded 事件中,您可…

2024美赛C题全网最早思路 网球运动(持续更新)

2024美赛已经于今天早上6点准时公布题目。本次美赛将全程跟大家一起战斗冲刺O奖!思路持续更新。 2024 MCM Problem C: Momentum in Tennis (网球运动的势头) 注:在网球运动中,"势头"通常指的是比赛中因一系…

npm和yarn区别

都是包管理工具,但是yarn的出现是为了弥补npmV4(npmV5结合yarn和自身的一些问题做了很大的升级,性能和速度都提高了)及之前版本的一些问题 npmV4的缺点 npm install的时候巨慢。特别是新的项目拉下来要等半天,删除nod…

数据分析基础之《pandas(3)—DataFrame运算》

一、算术运算 1、add() 加法运算 2、sub() 减法运算 3、想要得到每天的涨跌幅大小,求出每天close-open价格差 # 算术运算 close data[close] open1 data[open] # 收盘价减去开盘价 data[m_price_change] close.sub(open1) data.head() 二、逻辑运算 1、逻辑…

2024 美国大学生数学建模竞赛 美赛(C题)网球比赛趋势问题 国际大学生数学建模竞赛| 建模秘籍文章代码思路大全

铛铛!小秘籍来咯! 小秘籍希望大家都能轻松建模呀,华数杯也会持续给大家放送思路滴~ 抓紧小秘籍,我们出发吧~ 完整内容可以在文章末尾领取! 问题1 • 开发一个模型,捕捉到比赛进行时点的流动,…

在linux上,内存不够,设置虚拟内存

在 Linux 上,虚拟内存是指系统将硬盘空间作为内存使用的技术。当系统内存不足时,可以将不常用的内存数据保存到硬盘的交换分区(swap partition)上,这样释放出来的内存空间就可以被其他应用程序使用,从而避免…

倒计时67天

复习。 一.倒计时79天-CSDN博客 1. #include<bits/stdc.h> using namespace std; #define int long long const int N3e45; const int inf0x3f3f3f3f; int month[13]{0,31,28,31,30,31,30,31,31,30,31,30,31}; void solve() {int a[110]{},cn0;for(int i0;i<100;i)…

LeetCode --169

169. 多数元素 简单 相关标签 相关企业 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff…

Unchecked assignment 错误解决办法

下面一段程序编译 return new PagingModel(); 提示警告&#xff1a;Unchecked assignment public PagingModel<GasProductResponse> getProductList(SaleProductListVo vo) {log.info("[GasProductServiceImpl --> getProductList] - param: {}", JSON.toJ…

three.js CSS3DRenderer、CSS3DSprite渲染HTML标签

有空的老铁关注一下我的抖音&#xff1a; 效果: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"></div><…

python脚本扫描win系统中运行程序内存值并修改

用于修改运行中程序的内存值 #!encodingutf8import os import json import psutil import shutil import threading import ctypes import win32api import win32process from win32con import PROCESS_ALL_ACCESS class MemScan:注&#xff1a;一定要以系统管理员身份运行脚…

Kotlin 协程:用源码来理解 ‘viewModelScope‘

Kotlin 协程&#xff1a;用源码来理解 ‘viewModelScope’ Kotlin 协程是 Kotlin 语言的一大特色&#xff0c;它让异步编程变得更简单。在 Android 开发中&#xff0c;我们经常需要在后台线程执行耗时操作&#xff0c;例如网络请求或数据库查询&#xff0c;然后在主线程更新 UI…

Linux getty命令教程:管理物理或虚拟终端的利器(附案例详解和注意事项)

Linux getty命令介绍 getty&#xff0c;全称为get tty&#xff0c;是一个在主机上运行的Unix程序&#xff0c;用于管理物理或虚拟终端&#xff08;TTYs&#xff09;。当它检测到连接时&#xff0c;它会提示输入用户名并运行login程序以验证用户。 Linux getty命令适用的Linux…

微服务—RabbitMQ

目录 初识MQ 同步和异步通讯 同步通讯的优缺点 异步调用方案 异步通信优缺点 常见MQ技术对比 RabbitMQ快速入门 安装RabbitMQ RabbitMQ整体架构与相关概念 常见消息模型​编辑 入门案例 SpringAMQP 基本介绍 SpringAMQP案例——模拟HelloWorld消息模型 Sprin…

SpringCloud-搭建Eureka服务模块

在构建分布式微服务体系中&#xff0c;搭建Eureka服务模块是实现服务注册与发现的关键一步。Spring Cloud作为领先的微服务框架&#xff0c;通过Eureka为我们提供了高效的服务治理能力。本文将深入探讨如何使用Spring Cloud&#xff0c;逐步引导读者完成Eureka服务模块的搭建。…

【HarmonyOS】鸿蒙开发之ArkTs初步认识——第2.1章

ArkTs简介 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。 以下图可以展示Js&#xff0c;TS&#xff0c;ArkTs的关系 ArkTs基础语…

C++(17)——list的模拟实现

前面的文章中&#xff0c;介绍了&#xff0c;的模拟实现&#xff0c;本篇文章将介绍对于的模拟实现。 目录 1. list的基本结构&#xff1a; 2. list功能实现&#xff1a;尾部插入元素&#xff1a; 3. list迭代器的实现&#xff1a; 4. list功能实现&#xff1a;在任意位置前…

酒店管理小程序|基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)

酒店管理小程序目录 目录 基于微信小程序的酒店管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 &#xff08;1&#xff09;用户信息管理 &#xff08;2&#xff09;酒店管理员管理 &#xff08;3&#xff09; 房间信息管理 2、小程序…

语义分割:从早期探索到深度学习的突破

语义分割&#xff1a;从早期探索到深度学习的突破 语义分割的端倪&#xff1a;从早期探索到深度学习的突破引言早期技术&#xff1a;图像处理与模式识别边缘检测区域生长图割(Graph Cut)聚类方法 深度学习的兴起&#xff1a;CNN革命2012年 AlexNet的突破全卷积网络&#xff08;…