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 ;
结果如下
这时id = 1的行应该被锁住了
步骤2: 窗口2执行下面代码
begin; select * from user where id = 1 for update ;
结果如下,一直在等待
最后报锁超时错误
证明id = 1的行被锁住了
步骤3:
查询id=2的数据
begin; select * from user where id = 2 for update ;
可以查到结果
说明select * from user where id = 1 for update ;只锁了id = 1的行,id = 2行没有被锁
步骤4:
窗口1执行下面代码
commit;
结果如下
窗口2再执行下面代码
begin; select * from user where id = 1 for update ;
这时就可以查出结果来了
说明id = 1行锁被释放,窗口2就可以查到结果了
证明唯一索引锁行
b. 查询带普通索引字段
窗口1
begin; select * from user where user_name = '小明' for update ;
窗口2
begin; select * from user where user_name = '小王' for update ;
证明普通索引时锁行
c. 查询没索引字段
窗口1:
begin; select * from user where phone = 13123920201 for update ;
窗口2:
begin; select * from user where id = 2 for update ;
一直再查询
锁等待超时
证明没索引时锁表
到此这篇关于MySQL for update锁表还是锁行校验的文章就介绍到这了,更多相关MySQL for update锁表还是锁行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
解决mysql错误:Subquery returns more than 1 row问题
这篇文章主要介绍了解决mysql错误:Subquery returns more than 1 row问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-05-05MySQL PXC构建一个新节点只需IST传输的方法(推荐)
下面小编就为大家带来一篇MySQL PXC构建一个新节点只需IST传输的方法(推荐)。小编觉的挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-03-03在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)
为使用阿里云主机,没有装ftp,也没有装phpmyadmin,所以一切都得靠命令行。转移网站的重要一步就是转移数据库,这里简单介绍一下如何在这种情况下导入sql文件2014-02-02MySQL无法读表错误的解决方法(MySQL 1018 error)
这篇文章主要为大家详细介绍了MySQL无法读表错误的解决方法,MySQL 1018 error如何解决?具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-01-01
最新评论