溫馨提示×

溫馨提示×

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

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

MySQL半一致性讀原理的示例分析

發(fā)布時(shí)間:2021-11-02 17:13:15 來源:億速云 閱讀:353 作者:小新 欄目:MySQL數(shù)據(jù)庫

小編給大家分享一下MySQL半一致性讀原理的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

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語句中。在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ā)生鎖等待。

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

缺點(diǎn):非沖突串行話策略,對于binlog來說是不安全的。只能發(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層沒有發(fā)生鎖沖突,成功加上了鎖。即沒有半一致性讀

以上是“MySQL半一致性讀原理的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

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

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

AI