MySQL for update锁表还是锁行校验(过程详解)

 更新时间:2024年02月02日 11:08:58   作者:c103363  
在MySQL中,使用for update子句可以对查询结果集进行行级锁定,以便在事务中对这些行进行更新或者防止其他事务对这些行进行修改,这篇文章主要介绍了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_index
    on 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

锁等待超时

证明没索引时锁表

到此这篇关于MySQL for update锁表还是锁行校验的文章就介绍到这了,更多相关MySQL for update锁表还是锁行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文掌握MySQL锁表方法

    一文掌握MySQL锁表方法

    在MySQL中,可以使用多种方法来锁定表,这些方法取决于你的具体需求,比如是锁定整个表还是行级锁,本文给大家分享一些常用的MySQL锁表方法,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • MySQL入门完全指南及Linux系统下基本的安装教程

    MySQL入门完全指南及Linux系统下基本的安装教程

    这篇文章主要介绍了MySQL入门完全指南及Linux系统下基本的安装教程,对MySQL的基本特性有一个较为详细的整理,需要的朋友可以参考下
    2015-11-11
  • SQL NULL值的定义测试处理空数据及SQL UPDATE语句使用详解

    SQL NULL值的定义测试处理空数据及SQL UPDATE语句使用详解

    这篇文章主要为大家介绍了SQL NULL值的定义测试处理空数据及SQL UPDATE语句使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • MySQL 8.0的关系数据库新特性详解

    MySQL 8.0的关系数据库新特性详解

    广受欢迎的开源数据库MySQL 8中,包括了众多新特性,下面这篇文章主要给大家介绍了关于MySQL 8.0的关系数据库新特性的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2018-03-03
  • linux安装两个mysql(8.0和5.7),并同时使用方式

    linux安装两个mysql(8.0和5.7),并同时使用方式

    这篇文章主要介绍了如何在CentOS 7上下载和安装MySQL 8.0和MySQL 5.7.30,并详细描述了安装步骤,包括解压、配置、初始化和启动等过程
    2024-12-12
  • 搞定mysql行转列的7种方法以及列转行

    搞定mysql行转列的7种方法以及列转行

    在MySQL数据库中,有时候我们需要将一列数据转化为行数据,以便更好地进行数据分析和处理,下面这篇文章主要给大家介绍了关于搞定mysql行转列的7种方法以及列转行的相关资料,需要的朋友可以参考下
    2024-03-03
  • mysql 5.7.14 安装配置方法图文详细教程

    mysql 5.7.14 安装配置方法图文详细教程

    这篇文章主要为大家分享了mysql 5.7.14安装配置方法图文教程,详细介绍了mysql 5.7.14安装可能遇到的一系列问题,感兴趣的朋友可以参考一下
    2016-08-08
  • MySQL 日期格式化的使用示例

    MySQL 日期格式化的使用示例

    在MySQL中,可以使用DATE_FORMAT函数对日期进行格式化,本文就来介绍一下MySQL 日期格式化的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • MySQL误删后使用binlog恢复数据的实现方法

    MySQL误删后使用binlog恢复数据的实现方法

    这篇文章主要介绍了MySQL误删后使用binlog恢复数据的实现方法,使用 binlog 恢复数据的预期效果是将误删的数据还原到误删之前的状态,以减少或消除数据丢失的影响,文中有相关的代码示例和图文介绍,需要的朋友可以参考下
    2024-05-05
  • mysql-connector-java与Mysql、Java的对应版本问题

    mysql-connector-java与Mysql、Java的对应版本问题

    这篇文章主要介绍了mysql-connector-java与Mysql、Java的对应版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论