码迷,mamicode.com
首页 > 数据库 > 详细

MySQL的行锁

时间:2014-08-08 15:12:06      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   io   数据   for   ar   

概述

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

MySQL的行锁

标签:style   blog   color   使用   io   数据   for   ar   

原文地址:http://www.cnblogs.com/sysman/p/3899016.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!