您的位置:首页 > 博客中心 > 数据库 >

MySQL的行锁

时间:2022-03-13 22:40

概述

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的行锁,布布扣,bubuko.com

热门排行

今日推荐

热门手游