思考 | select…for update会锁表还是锁行?

77次阅读
没有评论

共计 466 个字符,预计需要花费 2 分钟才能阅读完成。

select查询语句是不会加锁的,但是select ….for update除外。

问题:

select …….for update加的是行锁还是表锁?

带着问题我们继续往下看。

验证:

建表sql

思考 | select...for update会锁表还是锁行?

关闭自动提交:

思考 | select...for update会锁表还是锁行?

案例一(主键):

开启第一个事务:

思考 | select...for update会锁表还是锁行?

第二个事务去更新数据,被阻塞了,长时间拿不到锁报错。

思考 | select...for update会锁表还是锁行?

我们再开启一个事务对另一条id为2的数据进行更新,更新成功。

思考 | select...for update会锁表还是锁行?

案例二 (索引):

age创建了唯一索引。

开启第一个事务:

思考 | select...for update会锁表还是锁行?

第二个事务去更新数据,被阻塞了,长时间拿不到锁报错。

思考 | select...for update会锁表还是锁行?

我们再开启一个事务对另一条id为2的数据进行更新,更新成功。

思考 | select...for update会锁表还是锁行?

案例三 (普通字段):

使用普通的字段name去操作,开启第一个事务。

思考 | select...for update会锁表还是锁行?

第二个事务去更新数据,被阻塞了,长时间拿不到锁报错。

思考 | select...for update会锁表还是锁行?

我们再开启一个事务对另一条id为2的数据进行更新,如果我更新成功了,就是锁行,失败了就是锁表。

思考 | select...for update会锁表还是锁行?

结论:

如果查询条件用了索引/主键,那么select … for update就会进行行锁。

如果是普通字段(没有索引/主键),那么select … for update就会进行锁表。

更多精彩内容,关注我们▼▼

思考 | select...for update会锁表还是锁行?
正文完
 0
数据与人
版权声明:本站原创文章,由 数据与人 于2023-04-19发表,共计466字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,若要转载请注明出处。
评论(没有评论)