概述
MySQL中的行所是基于索引的,行锁是锁定在索引上,所以如果某个字段没有索引,是无法上行锁的。
本文主要是实施验证的过程。
1.使用Innodb引擎建表
mysql> create table innodb( -> id int, -> name varchar(20), -> city varchar(20) -> ) engine innodb default charset utf8 -> ; Query OK, 0 rows affected (0.01 sec)
2.不建索引进行测试
插入测试数据
mysql> insert into innodb values(1,‘name1‘,‘city1‘); Query OK, 1 row affected (0.00 sec) mysql> insert into innodb values(2,‘name2‘,‘city2‘); Query OK, 1 row affected (0.00 sec) mysql> insert into innodb values(3,‘name3‘,‘city3‘); Query OK, 1 row affected (0.00 sec)
打开一个cmd连接mysql,我们成为session1,在session1中做如下操作
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select * from innodb where id=1 for update -> ; +------+-------+-------+ | id | name | city | +------+-------+-------+ | 1 | name1 | city1 | +------+-------+-------+ 1 row in set (0.00 sec)
我们在session1中锁定了innodb表的id=1的记录
我们再新开一个cmd窗口,我们成为session2
mysql> update innodb set name=‘name1-1‘ where id=2;
这个时候我们可以看到session2会一直等待。
这就证明了对于没有索引的字段,mysql是没法加行锁的,实际上使用的是表锁
session1提交之后,session2也就更新成功了。
3.建立索引测试
对innodb表的id字段添加索引
mysql> alter table innodb add index idx_id(id); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
在session1中设置不自动提交,锁定id=1的行
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select * from innodb where id=1 for update; +------+-------+-------+ | id | name | city | +------+-------+-------+ | 1 | name1 | city1 | +------+-------+-------+ 1 row in set (0.00 sec)
在session2中执行更新id=2的行
update innodb set name=‘name-bak‘ where id=2;
更新成功!
上述过程就证明了innodb的行锁就加到索引上的
MySQL的行锁
时间: 2024-10-04 02:43:31