mongodb一致性协议_mongo的怎么保持事物的一致性-问答-阿里云开发者社区-阿里云...
http://docs.mongoing.com/manual-zh/tutorial/perform-two-phase-commits.html
要么操作全都執(zhí)行,要么都不執(zhí)行,不能執(zhí)行一半,改了幾條數(shù)據(jù)了,看哎喲好像不對(duì),那扔著吧。Consistency 在數(shù)據(jù)庫(kù)領(lǐng)域的意思跟在分布式系統(tǒng)里的意思不一樣,指數(shù)據(jù)的外部約束有沒有滿足,比如帳戶之間轉(zhuǎn)賬,不能最后總和還是負(fù)數(shù),或者超過原來的總和了。
那文檔中的辦法是怎么做的呢?簡(jiǎn)單說,就是在執(zhí)行操作之前,記下來要做什么,以后可以 redo。然后保證每個(gè)操作都是 冪等的 ,就是說重復(fù)執(zhí)行也沒事。比如,賦值是冪等的,但是加一個(gè)數(shù)就不是冪等的。利用 MongoDB 提供的單文檔的原子性,使用一些輔助的數(shù)據(jù)做到冪等,最后把輔助的數(shù)據(jù)清除掉。如果你的操作本身就是冪等的,那就不需要輔助數(shù)據(jù)了。如果要 undo,也是可能的,那就要記下如何 undo。
但是 ACID 中的 Isolation 是沒有的,也就是說事務(wù)之間有交叉,別的并發(fā)操作可以看到中間不一致的狀態(tài),上面說的外部約束只能最終得到保證。比如說,事務(wù) T1 包括 (張三:加100;李四:減100),事務(wù) T2 包括 (張三:加200;李四:減200),如果不加以限制,可能的順序是:
1.T1 (張三:加100)
2.T2 (張三:加200)
3.T2 (李四:減200)
4.T1 (李四:減100)
T2 執(zhí)行的時(shí)候可以讀取并修改 T1 的中間結(jié)果,在轉(zhuǎn)賬這個(gè)問題上沒有大問題,因?yàn)榧訙p是 可交換 的操作,先后不影響最終結(jié)果。但是如果我們把事務(wù)改成 T1 (張三 = 100;李四 = 100)和T2 (張三 = 200;李四 = 200) 這樣最終的結(jié)果就可能是 (張三 = 200;李四 = 100),有可能就不滿足一致性了。但是如果能在應(yīng)用里保證順序地執(zhí)行這兩個(gè)事務(wù),問題就避免了。
大家也了解 Isolation 有幾個(gè)級(jí)別,還有多版本等更復(fù)雜的。傳統(tǒng)數(shù)據(jù)庫(kù)在單機(jī)上也會(huì)在更強(qiáng)的 Isolation 和性能之間做權(quán)衡,提供不同的級(jí)別可選。這一點(diǎn)在分布式系統(tǒng)中被稱作 Consistency,實(shí)現(xiàn)起來的代價(jià)就更高了,所以 MongoDB 不支持。不過對(duì)大多應(yīng)用,這并不是太大的問題:
1.可能異常情況在邏輯上也是可以接受的,比如微信群發(fā),每個(gè)人收到的順序并不一樣。
2.可能邏輯上并發(fā)就是不可能的,比如一個(gè)用戶只能修改自己的數(shù)據(jù),比如只有一個(gè)線程寫數(shù)據(jù)。
3.或者把需要的數(shù)據(jù)放到一個(gè)文檔里,對(duì)單文檔,MongoDB 保證原子性,別的操作也不可能看到文檔一半被改了。
4.或者可以在應(yīng)用上層發(fā)現(xiàn)并解決。比如支付寶轉(zhuǎn)賬就自己實(shí)現(xiàn)了一套一致性協(xié)議,1分鐘之內(nèi)可以保證這一筆數(shù)據(jù)一致了。
對(duì)你的要求,如果可以通過修改數(shù)據(jù)模型,讓改動(dòng)在一個(gè)文檔里就方便了。最好是看看你具體的需要和應(yīng)用的假設(shè),分析分析可能出現(xiàn)的異常情況,最后想辦法。還有一個(gè)辦法,貴司可以購(gòu)買 MongoDB 的支持服務(wù),針對(duì)你現(xiàn)在的產(chǎn)品階段和需求 (開發(fā),維護(hù),咨詢,培訓(xùn)),提供不同類型的專業(yè)級(jí)支持,比再請(qǐng)個(gè)程序員 / DevOp / DBA 便宜靠譜多了。
總結(jié)
以上是生活随笔為你收集整理的mongodb一致性协议_mongo的怎么保持事物的一致性-问答-阿里云开发者社区-阿里云...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微光app怎么签到
- 下一篇: 怎么打开网卡rss_RSS 进阶篇:Hu