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

2023年 11月 7日 66.1k 0

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

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

问题:

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

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

验证:

建表sqlCREATE TABLE `atao` (`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,`name` VARCHAR ( 255 ) DEFAULT NULL, `age` INT ( 11 ) DEFAULT NULL, PRIMARY KEY ( `id` ),KEY `idx_age` ( `age` ) USING BTREE ) ENGINE = INNODB; insert into atao(name,age) values ('唐三藏','20');insert into atao(name,age) values ('孙悟空','500');insert into atao(name,age) values ('猪八戒','100');insert into atao(name,age) values ('沙悟净','50');

关闭自动提交:

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就会进行锁表。

 

来源:数据与人

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论