mysql篇-select * from table for update使用行锁还是表锁?

select * from table for update使用行锁还是表锁,主要看是否使用到索引或主键,如果没有使用到索引或主键,则使用了表锁,如果使用到索引或主键,则是行锁
创建表

//id为主键  
//name 为唯一索引
CREATE TABLE `user` (
 `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
 `name` VARCHAR ( 255 ) DEFAULT NULL,
 `age` INT ( 11 ) DEFAULT NULL,
    `code` VARCHAR ( 255 ) DEFAULT NULL,
 PRIMARY KEY ( `id` ),
    KEY `idx_age` ( `age` ) USING BTREE 
) ENGINE = INNODB AUTO_INCREMENT = 1570068 DEFAULT CHARSET = utf8

行锁

使用主键或索引,select * from table for update使用行锁

select * from user where id=1  for  update
select * from user where name='zhangsan'  for  update

在执行select的同时开启事务,不提交事务,执行以下一条sql

update user set age=20 where id=1;
update user set age=20 where name='zhangsan';

会被阻塞一直无法更新数据,但是执行

update user set age=20 where id=2;

却是成功的,说明只阻塞了id=1或name=‘zhangsan’的行数据,所以是行锁

表锁

未使用索引或主键时,select * from table for update使用表锁

select * from user where code='abc' for update

执行sql前开启事务,不提交事务继续执行

update user set age=20 where id=2;
update user set age=18 where id=1;

会被阻塞无法更新数据

结果

如果查询条件用了索引或主键,那么select … for update就会进行行锁。
如果是普通字段(没有索引或主键),那么select … for update就会进行锁表。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值