mysql innodb的行鎖(4)
真正決定是否執行要上鎖的行不是取出來的行,而是掃描的行。
而是否最索引來掃描記錄,則跟具體的執行計劃有關係。
所以在分析鎖的問題,一定不要忘記看執行計劃.
會話1: 由於name是varchar型別,存在隱式轉換,所以掃描了所有的記錄,因而對所有的記錄上鎖了
root@sakila 10:33:04>explain select * from tab_no_index where name=1 for update;
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | tab_no_index | ALL | name | NULL | NULL | NULL | 6 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
root@sakila 10:34:30>select * from tab_no_index where name=1 for update;
+------+------+
| id | name |
+------+------+
| 1 | 1 |
+------+------+
1 row in set (0.00 sec)
會話2: 即使更新的記錄和回話1選出來的記錄不一樣,但是由於該記錄被第一個會話掃描過,被加鎖了,所以也不能上更新鎖
root@sakila 10:34:35>select * from tab_no_index where name='4' for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
而是否最索引來掃描記錄,則跟具體的執行計劃有關係。
所以在分析鎖的問題,一定不要忘記看執行計劃.
會話1: 由於name是varchar型別,存在隱式轉換,所以掃描了所有的記錄,因而對所有的記錄上鎖了
root@sakila 10:33:04>explain select * from tab_no_index where name=1 for update;
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | tab_no_index | ALL | name | NULL | NULL | NULL | 6 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
root@sakila 10:34:30>select * from tab_no_index where name=1 for update;
+------+------+
| id | name |
+------+------+
| 1 | 1 |
+------+------+
1 row in set (0.00 sec)
會話2: 即使更新的記錄和回話1選出來的記錄不一樣,但是由於該記錄被第一個會話掃描過,被加鎖了,所以也不能上更新鎖
root@sakila 10:34:35>select * from tab_no_index where name='4' for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/674865/viewspace-2135287/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL鎖:03.InnoDB行鎖MySql
- MySQL鎖:InnoDB行鎖需要避免的坑MySql
- Mysql研磨之InnoDB行鎖模式MySql模式
- Mysql innodb引擎(二)鎖MySql
- MySQL InnoDB 中的鎖機制MySql
- MySQL/InnoDB中,樂觀鎖、悲觀鎖、共享鎖、排它鎖、行鎖、表鎖、死鎖概念的理解MySql
- 詳解 MySql InnoDB 中的三種行鎖(記錄鎖、間隙鎖與臨鍵鎖)MySql
- MySQL InnoDB設定死鎖檢測的方法MySql
- 詳解 MySql InnoDB 中意向鎖的作用MySql
- MySQL:Innodb 一個死鎖案例MySql
- MySQL innodb 的間隙鎖定(next-key locking)MySql
- 在Linux中,mysql的innodb如何定位鎖問題?LinuxMySql
- mysql innodb lock鎖之record lock之一MySql
- Mysql技術內幕之InnoDB鎖探究MySql
- InnoDB常用鎖總結(行鎖、間隙鎖、臨鍵鎖、表鎖)
- MySQL底層概述—10.InnoDB鎖機制MySql
- MySQL -- 行鎖MySql
- MySQL 行鎖MySql
- MySQL 配置InnoDB的併發執行緒MySql執行緒
- 資料庫系列:MySQL InnoDB鎖機制介紹資料庫MySql
- MySQL優化篇系列文章(二)——MyISAM表鎖與InnoDB鎖問題MySql優化
- MySQL innodb引擎的事務執行過程MySql
- MySQL探祕(五):InnoDB鎖的型別和狀態查詢MySql型別
- MySQL資料庫InnoDB儲存引擎中的鎖機制GVMySql資料庫儲存引擎
- MySQL InnoDB中的事務隔離級別和鎖的關係MySql
- Innodb中有哪些鎖?
- 《MySQL實戰45講》學習筆記4——MySQL中InnoDB的索引MySql筆記索引
- MySQL鎖(四)行鎖的加鎖規則和案例MySql
- 全面瞭解mysql鎖機制(InnoDB)與問題排查MySql
- InnoDB意向鎖和插入意向鎖
- MySQL:Innodb purge執行緒略解MySql執行緒
- 三分鐘入門 InnoDB 儲存引擎中的表鎖和行鎖儲存引擎
- MySQL全域性鎖、表鎖以及行鎖MySql
- MySQL提升筆記(4)InnoDB儲存結構MySql筆記
- 淺談Innodb的鎖實現
- 【問答分享第一彈】MySQL鎖總結:MySQL行鎖、表鎖、排他鎖、共享鎖的特點MySql
- MySQL索引失效行鎖變表鎖MySql索引
- mysql行鎖和死鎖檢測MySql
- 論 MySql InnoDB 如何通過插入意向鎖控制併發插入MySql