数据库update语句到底是行锁还是表锁?

先说结论:无索引的情况下,如果不走主键,那么update为表锁;有索引的情况下,走索引或者走主键(效果一样),那么update变为行锁。

大致把问题分为两种情况:有索引或者没有索引

没有索引:

不走主键

先建一个没有索引的表,模拟一些数据,并且把事务自动提交关掉。

CREATE TABLE TestTable(
id BIGINT PRIMARY KEY,
name VARCHAR(20),
age int
);

INSERT  INTO testtable(id,name,age) VALUES (1,'李华',20);
INSERT  INTO testtable(id,name,age) VALUES (2,'小明',20);
INSERT  INTO testtable(id,name,age) VALUES (3,'小张',20);
INSERT  INTO testtable(id,name,age) VALUES (4,'小花',19);
INSERT  INTO testtable(id,name,age) VALUES (5,'铃铃',19);
INSERT  INTO testtable(id,name,age) VALUES (6,'莉莉',18);
INSERT  INTO testtable(id,name,age) VALUES (7,'阿花',17);

SHOW VARIABLES LIKE 'autocommit'	-- 观察事务自动提交是否关闭
set autocommit=OFF;	-- 关闭事务自动提交

我们先在第一个查询里执行update一次

然后我们再新建查询,模拟用户2,执行另一条update

 由此可见,在没有索引且不走主键的情况下,update是表锁。

走主键

我们再次执行语句,把where后面改成id = xx;(因为id为主键)

 我们再去查询2中模拟用户2进行更新操作

 发现用户2也可以完成更新操作,走主键的话update语句变为了行锁(并没有在用户2进行验证更新同一行内容,如有兴趣自行研究,此处只说结论)。

 有索引且走索引:

我们通过下面的语句为数据库加上索引

ALTER TABLE testtable add index idx_age(age);

 

 由结果可以得知,有索引且走索引时update语句不锁表,而是改为了锁行,为了严谨,我们让用户2执行修改age=17这一行的内容,发现被阻塞,所以可以肯定此时为锁行。

 好的,实验结束(其实还做了很多相关的实验,但没有展示,此篇仅展示最终结论),开始睡大觉,美好的一天从睡觉开始!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值