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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MYSQL DQL in 到底會不會走索引&in 範圍查詢引發的思考。MySql索引
- 關於聯合索引,範圍查詢,時間列索引的幾個問題索引
- 記錄一下MySql update會鎖定哪些範圍的資料MySql
- 理解索引(中):MySQL查詢過程和高階查詢索引MySql
- mysql 隨機查詢記錄MySql隨機
- Oracle日期時間範圍查詢Oracle
- mysql鎖表查詢MySql
- MySQL <唯一索引>MySql索引
- mysql 查詢記錄數大於一千萬的表MySql
- MySQL 唯一索引和普通索引MySql索引
- MySQL索引與查詢優化MySql索引優化
- MySQL函式查詢目錄樹問題記錄MySql函式
- MySQL資料庫查詢多個欄位值全部相同的記錄MySql資料庫
- MySQL 覆蓋索引、回表查詢MySql索引
- 根據時間範圍呼叫gitLab介面查詢Gitlab
- redis~有序集合處理ip範圍的查詢問題Redis
- mysql中文全文索引的記錄MySql索引
- Range範圍選區的理解
- MySQL慢查詢記錄原理和內容解析MySql
- MySQL next-key lock 加鎖範圍是什麼?MySql
- 一個查詢不走索引的例子索引
- Excel 2010 SQL應用032 字元範圍的模糊匹配查詢ExcelSQL字元
- MySQL 學習之索引篇和查詢MySql索引
- MySQL 索引及查詢優化總結MySql索引優化
- 談談MYSQL索引是如何提高查詢效率的MySql索引
- mysql唯一索引是什麼MySql索引
- MySQL欄位的取值範圍MySql
- MySQL 查詢字串的個數MySql字串
- mongodb索引--1億條記錄的查詢從55.7秒到毫秒級別MongoDB索引
- SQL 唯一查詢SQL
- MySQL鎖表相關問題查詢思路MySql
- mysql慢查詢,死鎖解決方案MySql
- MySQL索引原理及慢查詢最佳化MySql索引
- Mysql建表、索引、函式、查詢使用中的坑!!!MySql索引函式
- SQL:查詢每個類別最新的5條記錄SQL
- MySQL實驗: 實踐索引對全列匹配、最左字首匹配、範圍查詢等條件的影響以及瞭解髒讀、幻讀等MySql索引
- MySQL實戰45講——普通索引和唯一索引MySql索引
- mysql的唯一索引不會利用change bufferMySql索引