标签:style blog color 使用 io 数据 for ar
MySQL中的行所是基于索引的,行锁是锁定在索引上,所以如果某个字段没有索引,是无法上行锁的。
本文主要是实施验证的过程。
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)
插入测试数据
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也就更新成功了。
对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的行锁就加到索引上的
标签:style blog color 使用 io 数据 for ar
原文地址:http://www.cnblogs.com/sysman/p/3899016.html