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

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

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

mysql> commit;
Query OK, 0 rows affected

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

 

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

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

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM