1. 程式人生 > >mysql表鎖、行鎖、索引之間曖昧的關系

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

com ted 表鎖 ima auto inf sql div bsp

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.看下表的數據

技術分享圖片

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

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

mysql> commit;
Query OK, 0 rows affected

技術分享圖片

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

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

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

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