標籤: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的行鎖就加到索引上的