首页 > 代码库 > MySQL的行锁

MySQL的行锁

概述

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的行锁就加到索引上的