update语句锁表还是锁行

1 查询数据库自动提交设置方式
select @@autocommit – 查询数据库是否是自动提交的 结果1(true)为自动提交,结果0(false)为不自动提交
在这里插入图片描述
2 SET AUTOCOMMIT = 0; – 设置数据库提交方式为不自动提交
再次查询 select @@autocommit
在这里插入图片描述

3 创建表 tb_user

CREATE TABLE `tb_user` ( -- 创建表 
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `phone` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

在这里插入图片描述
4 插入两条数据
在这里插入图片描述

下面有两个测试,name字段有索引和无索引情况

测试1 name字段没有索引

步骤1

begin;
update tb_user set phone=111 where name="a";

刷新数据库:没有执行commit语句,数据库数据没有变
在这里插入图片描述
步骤2

begin;
update tb_user set phone=222 where name="b";

update语句锁表还是锁行_第1张图片
因为步骤1 已经把表锁住了,所以步骤2 的sql卡住,不能执行,数据库数据不变
update语句锁表还是锁行_第2张图片
步骤3 步骤1接着执行commit;
在这里插入图片描述
刷新数据库
在这里插入图片描述
步骤1 执行完成,步骤2没有执行commit,所以数据没有变

步骤4
步骤2继续执行commit;
在这里插入图片描述
在这里插入图片描述
结论:如果没有索引,update会锁表

测试2 name字段加索引

加索引

create index index_name on tb_user(name);

查索引

show INDEX from tb_user;

在这里插入图片描述
重置数据库数据
在这里插入图片描述
步骤1

begin;
update tb_user set phone=111 where name="a";

在这里插入图片描述
刷新数据库
在这里插入图片描述
步骤2

begin;
update tb_user set phone=222 where name="b";

update语句锁表还是锁行_第3张图片
刷新数据库
在这里插入图片描述
发现表并没有被锁住

如果执行下面的代码,则发现行被锁定了

begin;
update tb_user set phone=222 where name="a";

在这里插入图片描述
步骤1执行commit;
步骤2执行commit;
刷新数据库
在这里插入图片描述

结论:如果没索引,update会锁行

你可能感兴趣的:(update语句锁表还是锁行)