溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于源碼角度解析MySQL半一致性讀原理

發(fā)布時(shí)間:2020-04-30 10:53:39 來(lái)源:億速云 閱讀:434 作者:三月 欄目:MySQL數(shù)據(jù)庫(kù)

下文主要給大家?guī)?lái)基于源碼角度解析MySQL半一致性讀原理,希望基于源碼角度解析MySQL半一致性讀原理能夠帶給大家實(shí)際用處,這也是我編輯這篇文章的主要目的。好了,廢話不多說(shuō),大家直接看下文吧。

1、什么是半一致性讀

A type of read operation used for UPDATE statements, that is a combination of read committed and consistent read. When an UPDATE statement examines a row that is already locked, InnoDB returns the latest committed version to MySQL so that MySQL can determine whether the row matches the WHERE condition of the UPDATE. If the row matches (must be updated), MySQL reads the row again, and this time InnoDB either locks it or waits for a lock on it. This type of read operation can only happen when the transaction has the read committed isolation level, or when the innodb_locks_unsafe_for_binlog option is enabled.

就是發(fā)生在update語(yǔ)句中。在RC隔離級(jí)別或者innodb_locks_unsafe_for_binlog被設(shè)置為true,并發(fā)時(shí),如果update的記錄發(fā)生鎖等待,那么返回該記錄的prev 版本(在返回前會(huì)將鎖等待的這個(gè)lock從trx中刪除掉),到mysql層進(jìn)行where判斷,是否滿足條件。如果滿足where條件,那么再次進(jìn)入innodb層,真正加鎖或者發(fā)生鎖等待。

這樣做的好處是:減少同一行記錄的鎖沖突及鎖等待;無(wú)并發(fā)沖突時(shí),直接讀取最新版本加鎖,有沖突時(shí),不加鎖,讀取prev版本不需要鎖等待。

缺點(diǎn):非沖突串行話策略,對(duì)于binlog來(lái)說(shuō)是不安全的。只能發(fā)生在RC隔離級(jí)別和innodb_lock_unsafe_for_binlog下。

2、原理
基于源碼角度解析MySQL半一致性讀原理
3、講解

1)半一致性讀需要mysql層和innodb層配合使用。

2)mysql_update函數(shù)中,默認(rèn)都會(huì)調(diào)用try_semi_consistent_read在RC或innodb_lock_unsafe_for_binlog下加上試圖半一致性讀標(biāo)簽:prebuilt->row_read_type = ROW_READ_TRY_SEMI_CONSISTENT。真正執(zhí)行半一致性讀是由innodb層決定。

3)半一致性讀的條件:該記錄發(fā)生鎖等待;必須是全表掃描 && 該索引是二級(jí)索引

4)半一致性讀時(shí),構(gòu)建prev版本,然后調(diào)用函數(shù)lock_trx_handle_wait將鎖等待從trx中刪除。

5)返回prev rec前,會(huì)將置成半一致性讀標(biāo)簽:prebuilt->row_read_type = ROW_READ_DID_SEMI_CONSISTENT

6)返回到mysql層,會(huì)進(jìn)行where判斷。如果匹配,那么會(huì)再次進(jìn)入innodb層,由于prebuilt->row_read_type == ROW_READ_DID_SEMI_CONSISTENT,此時(shí)不再走半一致性讀判斷的流程,直接進(jìn)入加鎖或鎖等待。

5)這里update有個(gè)優(yōu)化:innodb層如果執(zhí)行計(jì)劃是索引下推,那么判斷where條件是否匹配會(huì)提前。若不匹配則提前調(diào)用函數(shù)row_unlock_for_mysql釋放聚集索引上的鎖

6)另外一個(gè)優(yōu)化:返回mysql層后,判斷where不匹配,則會(huì)調(diào)用unlock_row函數(shù)釋放鎖。注:這里update在innodb層沒(méi)有發(fā)生鎖沖突,成功加上了鎖。即沒(méi)有半一致性讀

對(duì)于以上基于源碼角度解析MySQL半一致性讀原理,大家是不是覺(jué)得非常有幫助。如果需要了解更多內(nèi)容,請(qǐng)繼續(xù)關(guān)注我們的行業(yè)資訊,相信你會(huì)喜歡上這些內(nèi)容的。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI