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
我們看到現在數據更新了。
第二種情況,通過索引條件檢索數據時,使用的是行鎖
如第一種情況,自己測試下。