之前我們討論了單一的TX的恢復脸甘。一份數(shù)據(jù)多個備份怎么保證CONSISTENCY旱幼,對多個變量一系列操作放在一個TX會如何奉件?
那么有多個并行的TX會如何呢?
你寫的東西被別人看見痴鳄,但是別人用了你的寫瘟斜,你卻回滾了。這就會有問題夏跷。
如果不對CONCURRENT TX管理的話哼转,系統(tǒng)會出現(xiàn)各種問題, 和DATA RACE 在parallel program 很相似槽华。
一個問題壹蔓,你能多提取500塊
你可以讓APPLICATION 來保護,比如去拿鎖猫态。 但是這會增加APPLICATION DEVELOPER 的負擔佣蓉,造成重復開發(fā)披摄,你的APP 和別人的APP會造成相同的數(shù)據(jù)塊的,這樣只拿自己內(nèi)存里的鎖是沒法保證的沒有DATA RACE的勇凭。
如果給STORAGE來做疚膊,那么APP就很簡單,上面什么都不用太考慮虾标。
今天我們來講ISOLATION寓盗,因為其他三個上一章已經(jīng)搞定了。
SERIALIZABILITY
2個TX并行執(zhí)行璧函,執(zhí)行完的結(jié)果傀蚌,等同于這2個TX串行的執(zhí)行的結(jié)果。
上面2個TX 并行執(zhí)行 的效果 和串行是等價的蘸吓,所以他們并行執(zhí)行沒有問題善炫。
下面這種調(diào)度的方式就會有問題
下面有2種SOLUTION,一種就是在TX這完全加鎖库继,這個是可以的箩艺,但是太慢。
另外一種是用一種細粒度的鎖宪萄。在OBJECT LEVEL艺谆。但是依然不是SERILIZABLE,看下圖雨膨。
這個是讀未提交的問題擂涛。
那么我們是不是可以讓寫鎖的時間變長一直到COMMIT,才放鎖來解決這個問題聊记。這個時候讀鎖還是立即釋放的鎖。這樣會出現(xiàn)另外一種不SERIALIZABLE情況恢暖。
這個問題是不可重復讀排监,就是在一個TX里面,讀一個OBJ讀2次結(jié)果不一樣杰捂。
所以對READ來說舆床,SHORT DURATION 也不行,也要變成LONG duration嫁佳。
這個比第一種GLOBAL 好的挨队,是細粒度的鎖的實現(xiàn)。
還可以用讀寫鎖來優(yōu)化蒿往。
二階段鎖定盛垦,第一個階段是GROWING,(集合會慢慢變大)瓤漏;第二個階段腾夯,SHRINKING(發(fā)生在COMMIT的時候颊埃,只會收縮)
上面這種情況是不可能實現(xiàn)的,因為紅色的A 的READ蝶俱,讀鎖拿不到班利。
拿不到鎖的時候,可以等榨呆,可以ABORT罗标。
如果是等的話,就會出現(xiàn)DEADLOCK积蜻。避免DEADLOCK闯割,可以使用按照一定的順序去拿鎖。
如果是看到1個變量拿一把鎖浅侨,是沒法實現(xiàn)的纽谒。除非在一開始你就知道要鎖哪些變量浅萧。
我們可以去檢查DEADLOCK市框,發(fā)現(xiàn)DEADLOCK,把其中一個ABORT谎脯。
1.通過分析拿鎖過程是否有環(huán)不见。
2.我檢查TIMEOUT澳化,很長時間拿不到就ABORT自己。(你的TX比較久稳吮,就會沒法執(zhí)行完就ABORT自己缎谷;輪流拿鎖輪流ABORT自己,就會有活鎖的情況)
因為TWO PHASE LOCK 鎖在OBJECT上灶似,但會有在一個LIST 加2個新的ITEM列林,這2個OBEJCT 鎖是不沖突的。概括的說酪惭,在查2次集合的時候希痴,2次的ITEMS 數(shù)目不一樣。一個會比另一個多春感。
問題就在于把LOCK放在OBJECT上砌创,在上述情況中,應(yīng)該把這個鎖加在搜索的集合上鲫懒。
用謂詞鎖嫩实,或者間隙鎖(B樹上鎖一個子樹(RANGE))
在實際中,默認不采用SERIALZABLE窥岩,因為性能會不好甲献。一個分析的SQL,就會是一個很長的READ ONLY的TX(比如分析1個小時)那么在這個TX谦秧,其他的TX會被擋住竟纳,所以造成別的功能就掛了撵溃。
所以我們需要在一個SERIALZABLE 上的一個優(yōu)化。突破的方式在一個TRADE OFF的變化锥累。
比如要更好的性能缘挑,要犧牲一些CONSISTENCY上的保證。
這就提出了一個MVCC的CONTROL
把所有寫操作BUFFER起來(因為不知道最后是COMMIT,還是ABORT桶略,還不希望讀到未提交的寫)语淘,讀的時候要選合適的版本。在提交時际歼,系統(tǒng)會驗證是不是可以讓讀VISIBILE惶翻。(樂觀鎖,如果發(fā)生了CONFILICT鹅心,就產(chǎn)生新的版本)
如果在COMMIT的時候吕粗,看寫X的時間,如果BUFFER SET里有個新的TX提交的X寫旭愧,就會ABORT颅筋。
下面再看一個例子。
上面的方案 等價的SERIAL 的 順序如下圖
但也是有個反例的输枯。
但是幻讀的問題解決了议泵。
如果隱含的條件不在TX里可以表達,那么無論是TWO PHASE LOCK 還是MVCC都不能實現(xiàn)桃熄。
上述都是在一臺機器上的并發(fā)事務(wù)先口。
如果在2臺機器上要保持事務(wù),多臺機器要達成一致瞳收,應(yīng)該怎么做呢碉京?
1。要所有人都同意
2螟深。如何處理有的人掛了
2 phase commit - > paxos