mysql的innodb引擎支持行级锁和表级索。默认是行级锁。关于行级锁具体是什么时候起作用。我们来探讨一下。
创建一个测试表
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
insert into test values (1,1,),(2,2);
客户端1:set autocommit=0;
select * from test where id=1 for update;
客户端2: update test set name='id2' where id=2; 提交成功
update test set name='id2' where id=1;
此时你会看到客户端2会阻塞,等待客户端1的提交。
客户端1: commit;
客户端2:执行成功。再回去查记录,会发现改变。 此时细节在于where里面使用的id是索引。使用行级锁。
然后步骤同上面一样,只是把name和id对调,然后你会发现数据库自始至终都是使用表级锁。