谈谈MySQL表级锁和行级锁
表级锁与索引无关
行级锁与索引的关系呢??答案是有关系的,但是要具体分析不同情况
- 主键索引与 行级锁的关系
- 非主键索引与行级锁的关系
实验如下:
CREATE TABLE `person_info_large` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
show VARIABLES like 'autocommit';
set autocommit = 0;
show VARIABLES like 'autocommit';
SELECT * FROM `person_info_large` p where p.name = 2 lock in share mode ;
这时候,在另一个事务中,更新表的同一行或另一方是会block住,
update `person_info_large` p set p.title = 'update' where p.name = 3 ;
需要等待上一个事务·解锁之后,才能做更新操作
结论1:Innodb在没有用到索引的时候,用的是表级锁 IS IX
结论2:Innodb在用到索引的时候,用的是行级锁/Gap锁
Gap锁是走普通非唯一索引时候,Innodb用到
结论3:无论是表级锁(开销小)还是行级锁,都分为共享锁和排他锁。
Innodb 表级别意向锁?
实验3 乐观锁的实现之一