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";

在这里插入图片描述
因为步骤1 已经把表锁住了,所以步骤2 的sql卡住,不能执行,数据库数据不变
在这里插入图片描述
步骤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";

在这里插入图片描述
刷新数据库
在这里插入图片描述
发现表并没有被锁住

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

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

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值