MySQL 唯一索引範圍查詢鎖下一個記錄的理解
相信大家研究過鎖的同學,都知道在唯一索引的範圍查詢,會鎖下一個記錄,在mysql45講中,作者也提到過,並且認為是個bug,但是官方沒有確認,針對這個問題,我也思考了下,下面描述下我的理解,如果不正確,麻煩指正。
mysql> show create table dba_test2\G *************************** 1. row *************************** Table: dba_test2 Create Table: CREATE TABLE `dba_test2` ( `id` int NOT NULL, `age` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `udx_age` (`age`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 select * from dba_test2; +-----+------+ | id | age | +-----+------+ | 1 | 11 | | 2 | 15 | | 3 | 20 | session1; ysql> select * from dba_test2 where age <=15 for update; +------+------+ | id | age | +------+------+ | 1 | 11 | | 2 | 15 | +------+------+ 2 rows in set (0.01 sec) session2 --被阻塞 delete from dba_test2 where age=20;
我的理解,如果有這樣的事務
begin;
update dba_test2 set age=88 where age=15;
select * from dba_test2 where age <=15 for update;
這樣select的時候,看到id=15的記錄已經沒有了,會向後查詢定位記錄,找到後加鎖,那為什麼不向前查詢定位記錄,向前的話加的鎖範圍就不對了,導致幻讀。所以是向後定位一個記錄,如果沒有20這個記錄,那麼就會在最大值上加範圍鎖。
針對這個case,8.0最佳化了,只是鎖了15之前的記錄,應該是去查15這條記錄是否真實存在了,存在就加15之前的,不存在就向後多加一個範圍。
8.0針對最大值的範圍,查詢沒有縮小範圍,
select * from dba_test2 where id <=3.,將最大值這個範圍鎖上了,這個比較奇怪,按理說都是下一個記錄鎖,處理的方式應該跟上面的方式一樣,看來還是沒有徹底解決這個問題。
有興趣學習原始碼的加群一起學習啊 QQ: 700072075
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25719946/viewspace-2915876/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【索引】反向索引--條件 範圍查詢索引
- MongoDB範圍查詢的索引優化MongoDB索引優化
- 【索引】反向索引--條件 範圍查詢(二)索引
- MYSQL DQL in 到底會不會走索引&in 範圍查詢引發的思考。MySql索引
- 關於聯合索引,範圍查詢,時間列索引的幾個問題索引
- 記錄一下MySql update會鎖定哪些範圍的資料MySql
- 查詢鎖表記錄
- 理解索引(中):MySQL查詢過程和高階查詢索引MySql
- [MySQL] - 聯表查詢,查詢一個不在另一個表的記錄MySql
- [Mysql 查詢語句]——查詢指定記錄MySql
- Oracle日期時間範圍查詢Oracle
- Mysql查詢調優記錄MySql
- mysql 隨機查詢記錄MySql隨機
- Mysql索引的使用 - 組合索引 + 範圍條件的處理MySql索引
- 在oracle查詢記錄時給記錄加鎖(轉)Oracle
- mysql鎖表查詢MySql
- UPDATE查詢結果範圍內的資料
- MySQL 查詢所有表中的記錄數MySql
- MySQL <唯一索引>MySql索引
- mysql查詢索引結構MySql索引
- MongoDB之資料查詢(範圍運算)MongoDB
- oracle 全表掃描,索引範圍掃描與塊的理解Oracle索引
- MySql 鎖表 查詢 命令MySql
- mysql 查詢記錄數大於一千萬的表MySql
- MySQL 唯一索引和普通索引MySql索引
- 高效的SQL(Index-Organized Tables優化精確查詢和範圍查詢)SQLIndexZed優化
- MySQL函式查詢目錄樹問題記錄MySql函式
- 唯一索引操作可能產生的鎖索引
- Range範圍選區的理解
- MySQL索引與查詢優化MySql索引優化
- MySQL資料庫查詢多個欄位值全部相同的記錄MySql資料庫
- MySQL 5.7 查詢InnoDB鎖表MySql
- 查詢某個表的索引資訊索引
- 簡單記錄幾個有用的sql查詢SQL
- 根據時間範圍呼叫gitLab介面查詢Gitlab
- mysql中文全文索引的記錄MySql索引
- MySQL 覆蓋索引、回表查詢MySql索引
- MySQL慢查詢記錄原理和內容解析MySql