關於mysql innodb next key lock 的一些疑問?

時間 2021-05-12 06:21:50

1樓:LV Summer

我認為這裡有兩個原因:

幻讀是指兩次讀取結果不一致。select沒有讀取41,所以也不會出現幻讀。即便是select了41,事務中的普通select並不會加next-key鎖,所以insert(5,41)可以成功

mysql解決幻讀的方法是next-key lock。對於題目中的情況,加鎖區間應該是(30~40],而不包括後面的(40,50)。當這個索引是唯一索引是,並且操作符是=時,就成為了行級鎖。

2樓:light0x00

因為你的age並不是唯一索引, 不鎖30~40,40~50間隙,意味著其他事務可以在任意位置插入age相等的行.

假設現在事務B像下面這樣插入一條 age=40的記錄.

insert

into

test

values(5

,40);此時age的二級索引的葉子頁是下面這樣(1,20),(2,30),(3,40)(5,40),(4,50)

這樣你的事務裡第二次查詢「age=40」, 就會搜出「兩條age=40的記錄」,也就產生了幻讀.

select

*from

test

where

age=40;

結果:(3

,40)(5

,40)

3樓:葉金標

因為你的age索引是非唯一索引,那麼你插入的是(5,40)的話,不加gap鎖,就能插入了,這時第二次

select * from test where age = 40,就出現兩條記錄了,就出現幻讀了

4樓:Morris

首先,你這個查詢會用一致性非鎖定讀,而不會加鎖。

注意,你age上的是輔助索引,where子句包含輔助索引的條件時,需要先搜尋輔助索引,得到主鍵,再根據主鍵去聚集索引上,找到對應記錄。

聚集索引、輔助索引都是B+樹實現,同乙個節點中key按順序排列,比如你的輔助索引葉節點,按照你的資料來排,就是20, 30, 40, 50,本來是沒有41的,在你的這個事務中第一次查輔助索引查不到41,如果你不鎖區間,這個時候別的事務新增了乙個(5, 41),你這個事務第二次不就查到41了麼。

這就是Phantom Problem了,同乙個事務裡兩次查詢結果不一致,事務隔離性打破了。所以,在輔助索引上的next-key lock要鎖區間,輔助索引上鎖了區間,相應的在聚集索引上同樣會加乙個record lock。

關於大學,關於愛情?

棲梧桐 步青雲 首先這取決於你自己的想法,沒以前沒談過戀愛的話可以體驗或者嘗試一下,畢竟早點經歷是有好處的,但是也有個前提,是碰到自己心動的那個人,要是以前談過戀愛,估計也就不會提問了嘿嘿 偷個懶 現在是六月二十三日臨晨三點,作為湖北考生的我還在焦急的等著我的高考分數。這一夜的感受或許我終生難忘,也...

關於工作關於生孩子?

總有人勸你早點要孩子 關於這一點除了身材恢復,相對風險低一些之外,我看到的都是弊端。養大乙個孩子事需要太多的愛和足夠成熟的父母的,還得有能力去撫養。年輕人,你連你自己跟這個社會關係都沒處理好,連自己想要什麼都沒弄明白,你怎麼為你的孩子負責任,養自己和養孩子道路上的你的各種慌亂,掙扎,盲目,你不怕會毀...

關於友情,關於被冷落。?

簡單幸福 向來都是這樣三個好朋友總是兩個好蕭瑟別的乙個先查詢你自身的原因然後再看看她們是不是純心要蕭瑟你的如果是你自己的原因那就改正缺點仍是相同的不冷不熱的和她們做朋友如果是她們故意的那你就知趣點找到你自己的那個知己我上學的時候常常遇到像你這樣的事三個人是沒辦法很接近的做好朋友的!送杜少府之任蜀州 ...