mysql使用MVCC來解決幻讀 幻讀和不可重復(fù)讀的區(qū)別?
幻讀和不可重復(fù)讀的區(qū)別?不可重復(fù)讀取類似于魔術(shù)讀取,兩者在事務(wù)中多次讀取不同的數(shù)據(jù)。網(wǎng)絡(luò)上的總結(jié)如下:所謂虛擬讀取,通常稱為不可重復(fù)讀取,是指在數(shù)據(jù)庫訪問中,一個事務(wù)范圍內(nèi)兩個相同的查詢返回不同的數(shù)據(jù)
幻讀和不可重復(fù)讀的區(qū)別?
不可重復(fù)讀取類似于魔術(shù)讀取,兩者在事務(wù)中多次讀取不同的數(shù)據(jù)。網(wǎng)絡(luò)上的總結(jié)如下:所謂虛擬讀取,通常稱為不可重復(fù)讀取,是指在數(shù)據(jù)庫訪問中,一個事務(wù)范圍內(nèi)兩個相同的查詢返回不同的數(shù)據(jù)。這是在查詢過程中提交系統(tǒng)中的其他事務(wù)修改導(dǎo)致的。例如,事務(wù)T1讀取某個數(shù)據(jù),事務(wù)T2讀取并修改該數(shù)據(jù),并且事務(wù)T1再次讀取該數(shù)據(jù)以驗證讀取值,并且獲得不同的結(jié)果。更容易理解的方法是在事務(wù)中多次讀取相同的數(shù)據(jù)。在此事務(wù)結(jié)束之前,另一個事務(wù)訪問相同的數(shù)據(jù)。然后,在第一個事務(wù)的兩次讀取之間。由于對第二個事務(wù)的修改,第一個事務(wù)讀取的數(shù)據(jù)可能不同,因此在一個事務(wù)中讀取兩次的數(shù)據(jù)是不同的,因此稱為不可重復(fù)讀取,即原來的讀取是不可重復(fù)的。所謂的不真實讀取是指事務(wù)a讀取與搜索條件匹配的幾行。事務(wù)B通過插入或刪除行來修改事務(wù)a的結(jié)果集,然后提交。虛讀是指當(dāng)事務(wù)沒有獨立執(zhí)行時發(fā)生的一種現(xiàn)象。例如,第一個事務(wù)修改表中的數(shù)據(jù)。例如,此修改涉及表中的“所有數(shù)據(jù)行”。同時,第二個事務(wù)還通過在表中插入“一行新數(shù)據(jù)”來修改表中的數(shù)據(jù)。之后,操作第一個事務(wù)的用戶會發(fā)現(xiàn)表中沒有修改過的數(shù)據(jù)行,這就像幻覺。解決幻覺的一般方法是增加范圍鎖定范圍,將鎖檢查范圍鎖定為只讀,以避免幻覺。簡言之,虛讀是由插入或刪除引起的。一般的區(qū)別是不可重復(fù)讀取是由另一個事務(wù)更改數(shù)據(jù)引起的,而虛讀取是由插入或刪除另一個事務(wù)引起的
不可重復(fù)讀?。涸谖刺峤坏氖聞?wù)中,二次查詢結(jié)果可能不同,因為在執(zhí)行此事務(wù)的過程中,外部事務(wù)可能會修改并提交數(shù)據(jù)集
!虛幻閱讀:操作過程中的事務(wù)!有其他事務(wù)修改并提交此數(shù)據(jù)集,但無法讀取這些操作的第一個事務(wù)。提交此事務(wù)時,可能會導(dǎo)致錯誤:找不到插入的數(shù)據(jù),但重復(fù)插入
!不可重復(fù)讀取和非真實讀取的區(qū)別:
不可重復(fù)讀取可以讀取其他事務(wù)提交的數(shù)據(jù),而非真實讀取不能讀取其他事務(wù)提交的數(shù)據(jù)
!間隙鎖:間隙鎖主要用于防止不真實的讀取。它在可重復(fù)讀取隔離級別下使用。它是指在檢索數(shù)據(jù)的條件和范圍時,鎖定數(shù)據(jù)范圍中可能不存在的值
mysql有了間隙鎖只有能夠解決幻讀問題嗎?
Mvcc現(xiàn)在用于主流數(shù)據(jù)庫。使用RR隔離級別后,將不會發(fā)生不真實的讀取。
根據(jù)不同的材料,RR是199X的ANSI SQL標(biāo)準(zhǔn),但真正的數(shù)據(jù)庫不一定符合標(biāo)準(zhǔn)(事實上,最好沒有虛讀)。
MySQL的可重復(fù)讀級別能解決幻讀嗎?
對于MySQL,可能會發(fā)生臟讀、不可重復(fù)讀和不真實讀。MySQL的默認(rèn)設(shè)置是repeatable read,即在一個事務(wù)中不會讀取不同的數(shù)據(jù)。您可以執(zhí)行以下操作:
1)打開兩個客戶端,兩個客戶端都設(shè)置為RR;
2)在一個事務(wù)中,查詢一個操作以查找一段數(shù)據(jù);例如,字段version=1中有數(shù)據(jù);
3)在另一個事務(wù)中,刪除version=1的數(shù)據(jù);刪除后,查詢該事務(wù)中的數(shù)據(jù)是否為2所屬沒有更改,或者有版本為1的數(shù)據(jù);
4)當(dāng)我們繼續(xù)更新2所屬事務(wù)中的數(shù)據(jù)時,我們會發(fā)現(xiàn)它無法更新,并且會看到版本為1的數(shù)據(jù)。緩存一致性:緩存一致性,用什么一致性?它與數(shù)據(jù)庫一致,外部查詢每次都是一致的。那么,應(yīng)該首先在緩存和數(shù)據(jù)庫之間更新哪一個呢?有些人可能認(rèn)為我可以先更新數(shù)據(jù)庫,然后再更新緩存?但是你想過一個問題嗎?當(dāng)用戶成功支付時,更新數(shù)據(jù)庫,但是什么?如果你仍然顯示你沒有在緩存中付費(fèi),當(dāng)用戶頻繁點擊,數(shù)據(jù)庫壓力太大而無法同步到緩存時,你會感到尷尬嗎?這是一個典型的不一致。當(dāng)用戶再次付費(fèi)時,你告訴他已經(jīng)付費(fèi)了,他會罵死你。你怎么能這么做?我們可以先更新緩存,然后再更新數(shù)據(jù)庫,那有什么問題?1) 緩存更新成功,但數(shù)據(jù)庫更新失敗,并被其他并發(fā)線程訪問。2) 緩存消除成功,但數(shù)據(jù)庫更新失敗,也會導(dǎo)致后期數(shù)據(jù)不一致