网站首页 > 教程文章 正文
我们在数据库执行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语句有索引反而更慢
- 06-18CentOS7安装Mongodb 4.x.x(centos7安装openstack)
- 06-18Window环境配置Mongodb(mongodb默认配置文件路径)
- 06-18FineReport如何连接和使用MongoDB数据库
- 06-18nosql之mongodb(nosql怎么读正确发音)
- 06-18Mongodb centos7安装(mongodb4.4.2安装教程)
- 06-18群晖(Synology)NAS 安装 MongoDB(群晖安装nat123)
- 06-18MongoDB 安装及实践(mongodb的安装过程和操作命令)
- 06-18MongoDB最全详解(万字图文总结)(mongodb lsm)
- 最近发表
-
- CentOS7安装Mongodb 4.x.x(centos7安装openstack)
- Window环境配置Mongodb(mongodb默认配置文件路径)
- FineReport如何连接和使用MongoDB数据库
- nosql之mongodb(nosql怎么读正确发音)
- Mongodb centos7安装(mongodb4.4.2安装教程)
- 群晖(Synology)NAS 安装 MongoDB(群晖安装nat123)
- MongoDB 安装及实践(mongodb的安装过程和操作命令)
- MongoDB最全详解(万字图文总结)(mongodb lsm)
- CentOS安装MongoDB教程(centos安装mpich)
- MongoDB入门指南:下载、安装和配置一款强大的NoSQL数据库
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (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)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)