首页 > 代码库 > 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)
我们再新开一个cmd窗口,我们成为session2
mysql> update innodb set name=‘name1-1‘ where id=2;
这就证明了对于没有索引的字段,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的行锁就加到索引上的
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。