mysql表鎖、行鎖、索引之間曖昧的關係

MySQL的innodb存儲引擎支持行級鎖,innodb的行鎖是通過給索引項加鎖做到的,這就意味著只有通過索引條件檢索數據時,innodb才使用行鎖,否則使用表鎖。

根據當前的數據更新語句(UPDATE user set name=’11111′ where account=’1’),該條件字段account並沒有添加索引,所以導致數據表被鎖。

我們驗證一下:

第一種情況,通過非索引條件檢索數據時,使用的是表鎖,會導致數據表被鎖

1.首先,我們將mysql事務設置為不自動提交,mysql事務默認是自動提交事務的,1表示自動提交事務

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set
mysql> set autocommit = 0
;
Query OK, 0 rows affected

2.起一個命令行,開始事務,更新第一條記錄,先不提交

mysql> start transaction;
Query OK, 0 rows affected
mysql> beg
in;
Query OK, 0 rows affected
mysql> UPDATE user set name='11111' where account='1'
 -> 

3.我們再起一個命令行,更新第二條記錄

UPDATE user set name='2222' where id='2'

4.看下表的數據

mysql表鎖、行鎖、索引之間曖昧的關系

可以看到,數據表沒有更新

5.把第一個命令行的事務提交了

mysql> commit;
Query OK, 0 rows affected

mysql表鎖、行鎖、索引之間曖昧的關系

我們看到現在數據更新了。

第二種情況,通過索引條件檢索數據時,使用的是行鎖

如第一種情況,自己測試下。

使用 Facebook 預約

About 小秘書 22248 Articles
不用擔心找不到好對象,戀愛小秘書 - 綺綺 會根據您的喜好和條件,幫您安排與理想對象一對一排約、聯誼、交友友活動,現在就加入綺綺的LINE_ID:erostp