网站首页 > 教程文章 正文
我们在数据库执行update语句的时候,到底是锁表还是锁行?这里直接用MySQL上例子测试下。
一、环境准备
1、新建一个表
create table test_update(
id BIGINT not null primary key COMMENT '主键ID,雪花算法生成',
name VARCHAR(100) COMMENT '姓名',
user_no VARCHAR(20) COMMENT '用户编号'
);
2、插入两条数据
insert into test_update(id,name,user_no)values(1,'张三','001');
insert into test_update(id,name,user_no)values(2,'李四','002');
二、开始测试
场景一:不加索引
开启事务
sql1:update test_update set name=’张三1’ where user_no in(‘001’);
不提交事务
开启事务
sql2:update test_update set name=’李四1’ where user_no in(‘002’);
提交事务
我们发现在sql1不提交事务的情况下,sql2被阻塞了,只有当sql1的事务提交后sql2才会执行成功。
总结:在不加索引的情况下,update语句锁表。
场景二:加索引
先在user_no加索引
ALTER TABLE test_update ADD INDEX index_name (user_no);
开启事务
sql1:update test_update set name=’张三1’ where user_no in(‘001’);
不提交事务
开启事务
sql2:update test_update set name=’李四1’ where user_no in(‘002’);
提交事务
我们发现在sql1不提交事务的情况下,sql2也执行成功了,也就是sql2不依赖于sql1的事务提交。
总结:在加索引的情况下,update语句锁行。
场景三:加索引,但是in里面是复杂查询
上面的例子in里面都是确定的值,加入in里面是查询出来的呢,如下例子(user_no已经加上索引)
开启事务
sql1:update test_update set name=’张三1’ where user_no in(select user_no from other_table where id=1);
不提交事务
开启事务
sql2:update test_update set name=’李四1’ where user_no in(select user_no from other_table where id=2);
提交事务
我们发现在sql1不提交事务的情况下,sql2被阻塞了,只有当sql1的事务提交后sql2才会执行成功,跟场景一结果一样。
总结:在加索引的情况下,in里面是不确定的值,update语句锁表。
猜你喜欢
- 2024-12-28 《黑屏死机》 电脑黑屏死机
- 2024-12-28 SQL轻松入门(1):增删改与简单查询
- 2024-12-28 【数据库】Upsert = Update or Insert
- 2024-12-28 SQL查询语句大全(一) sql查询语句命令大全
- 2024-12-28 大数据开发基础之SQL语句基本操作
- 2024-12-28 SQL CASE WHEN的用法 sql case when 的用法详解
- 2024-12-28 高并发下如何防重? 如何防止高并发
- 2024-12-28 最全汇总|SQL Server与Access数据库sql语法差异
- 2024-12-28 SQL left join 左表合并去重技巧总结
- 2024-12-28 为什么一条UPDATE语句有索引反而更慢
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)