mysql 一致性非鎖定讀有些迷惑。?

時間 2021-06-10 00:14:53

1樓:陳廣勝

mvcc會讀到舊版本資料,但讀到舊版本資料不一定就是錯誤。定義錯誤的標準就是看是不是可序列化。可序列化,簡單的說就是好像事務是乙個接著乙個序列的執行一樣。

一致非鎖定讀(snapshot),並不一定是不可序列化的。

例如,排程H1,

H1: R1(Y0, 30) R2(X0, 50) W2(X2, 70) C2 R1(X0, 50) C1

(說明: R1(X0, 50)代表事務T1讀取X被事務T0寫入的舊版本50;W2(X2, 70)代表事務T2對X寫入新版本70;C1代表事務T1提交。以此類推 )

因為H1和排程H'

H'=R1(Y0, 30) R1(X0, 50) C1 R2(X0, 50) W2(X2, 70) C2

有相同的『效果』,H'是乙個序列的排程,H1是乙個與之Conflict Equivalence的等價排程,H1是乙個可序列化的排程。雖然事務T1讀了X的舊版本,但事務是『正確』的。

排程H2,

H2: R1(X0, 70) R2(X0, 70) R1(Y0, 80) R2(Y0, 80) W1(X 1, 30) C1 W2(Y2, 20) C2

因為無法找到乙個與之Conflict Equivalence的等價排程,所以H2是不可序列化的。類似這種不可序列化的異常被稱為write skew。

實際應用場景中,對資料庫的訪問都是有特定的access pattern的,特定的access pattern不會在一致非鎖定讀(snapshot)隔離下發生錯誤。比如常用作OLTP的benchmark TPCC,就不會發生類似H2的錯誤。另為許多隔離性要求不高的場景下,即使發生一些錯誤,也可以接受。

MySQL怎麼實現隔離級別的

MySQL 是如何實現四大隔離級別的?

Write Skew在MySQL上的例子

關於mysql的InnoDB多版本併發控制(MVCC)與事務隔離級別的疑問?

MySQL還有乙個比較怪異的地方,就是併發的寫寫衝突不回滾,這個也會導致異常

請問 Mysql/Innodb 的 RR 模式下哪種情況下需要手動加鎖啊?

flink中一致性檢查點,這個一致性怎麼理解,是什麼和什麼一致,跟分布式中一致性演算法一樣嗎?

歡歌 從物理意義上,checkpoint 分布式快照是乙個有意義的系統狀態,但不一定對應某個時刻的狀態 沒法讓所有節點在同乙個時刻拍照 一致性的含義是 不違背事件間固有的因果關係,即如果系統裡面有兩個事件 e1 和 e2,且 e2 依賴於 e1,那麼快照不能只包含了 e2,但是卻沒有包含 e1。舉個...

如何評價一致性演算法 PacificA ?

辛塞凱諾卡密 有一點我覺比較爽,省去了集群自選舉的邏輯,把這件事交給Nameserver做,直接判斷PreparedList的完整性以及First Win即可。 laliliu 個人覺得PacificA沒有Paxos,Raft流行,可能跟msra沒有強力推廣也有關,另外,感覺PacificA有不少v...

關於kafka的一致性的疑問?

胡明 可以看一下這個 huxihx 說說我的淺見 kafka的old leader由於gc等原因soft fail的時候選舉了新的leader,那麼old leader回來時會發生什麼情況?如果broker因為某些原因 像你所說的long gc 導致與Zk的會話斷開,那麼依託於Zk的watch機制,...