plsql清完表需不需要提交事务_分布式基础-分布式事务
前言
沒(méi)有數(shù)據(jù)庫(kù)前,數(shù)據(jù)如果是文件方式存儲(chǔ)在磁盤(pán)中,那么如果寫(xiě)入的過(guò)程中,可能寫(xiě)入過(guò)程中出差;或者因?yàn)槲覀兂绦驋斓粼?導(dǎo)致數(shù)據(jù)可能寫(xiě)了一半,如果多個(gè)應(yīng)用程序同時(shí)在寫(xiě)程序的話,那問(wèn)題就更加復(fù)雜。
數(shù)據(jù)庫(kù)發(fā)明,特別是事務(wù)概念,解決了這個(gè)問(wèn)題,事務(wù)將多個(gè)讀寫(xiě)操作看成一個(gè)整體,要么成功要么失敗,對(duì)于應(yīng)用程序來(lái)說(shuō),簡(jiǎn)化了我們的操作,失敗的時(shí)候,我們知道數(shù)據(jù)是干凈的,不存在亂的問(wèn)題,可以放心地重試。說(shuō)實(shí)話,事務(wù)涉及的東西挺多的,只能盡力去按照學(xué)習(xí)的內(nèi)容梳理下。
一 事務(wù)
事務(wù)除了原子特性,還有一致性,隔離性,持久性,這四個(gè)特性。這就是耳熟能詳?shù)?ACID。A 代表原子性 Atomicity,C 代表一致性(Consistency), I 代表隔離性(Isolation)與 D 持久性(Durability)。
原子性,記得學(xué)習(xí)化學(xué)的時(shí)候, 學(xué)過(guò)“分子是保持物質(zhì)化學(xué)性質(zhì)的一種微粒,而原子是化學(xué)變化中最小的微粒”從這個(gè)角度來(lái)說(shuō),原子在化學(xué)變化中是不可分的。利用這個(gè)不可分的特性,來(lái)表示事務(wù)要么全部成功,要么全部失敗,不存在中間狀態(tài),這樣數(shù)據(jù)就很干凈,非黑即白,不存在灰色地帶;
一致性,一致性理解起來(lái)是有點(diǎn)別扭,數(shù)據(jù)滿足特定的預(yù)定狀態(tài),經(jīng)過(guò)事務(wù)之后仍然滿足這些事務(wù)的狀態(tài)約束。
隔離性,多個(gè)數(shù)據(jù)庫(kù)的客戶端在同時(shí)操作的時(shí)候,相互隔離,互不影響,完全不影響比較難,多個(gè)事務(wù)共同執(zhí)行的時(shí)候,可能會(huì)出現(xiàn)臟讀,不可重復(fù)讀,幻讀的問(wèn)題。為解決這些問(wèn)題,隔離性也是分級(jí)別的,讀未提交,讀已提交,可重復(fù)讀,串行化。隔離性從前到后越來(lái)越嚴(yán)格,性能也越來(lái)越差。
讀未提交,一個(gè)事務(wù)沒(méi)提交時(shí),它的變更就被其他的事務(wù)看到,那么從這個(gè)角度來(lái)說(shuō)就有影響了,因?yàn)闆](méi)提交的事務(wù),如果最后事務(wù)回滾了,那就讀到臟數(shù)據(jù)了;讀提交,是一個(gè)事務(wù)提交之后,別的事務(wù)才可以看到,這樣就不會(huì)存在讀到臟數(shù)據(jù)了;可重復(fù)讀,是指一個(gè)事務(wù)執(zhí)行過(guò)程中看到的數(shù)據(jù),總跟這個(gè)事務(wù)啟動(dòng)時(shí)看到數(shù)據(jù)一致,讀提交雖然保證了事務(wù)提交之后才可以看到,但是在另外一個(gè)事務(wù)中隨著時(shí)間的推移,我們看到的數(shù)據(jù)可能是不同的;而可重復(fù)讀保障了在一個(gè)事務(wù)中看到的數(shù)據(jù)是相同的,可以解決幻讀的其他問(wèn)題。 串行化,串行化可以解決一切事務(wù)問(wèn)題,因?yàn)樗械氖聞?wù)都是排序的了,所以不會(huì)有沖突。持久性,一旦事務(wù)提交成功,即使存在硬件故障或數(shù)據(jù)庫(kù)崩潰,事務(wù)對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)更改影響是持久的。
二 分布式事務(wù)
對(duì)于分布式系統(tǒng)來(lái)說(shuō),事務(wù)變的更加復(fù)雜,分布式事務(wù)經(jīng)常用來(lái)解決的是多個(gè)系統(tǒng)操作的時(shí)候的事務(wù)問(wèn)題。最常用舉例的是電子商務(wù)上,我們購(gòu)買(mǎi)東西,需要建立一個(gè)訂單,并且需要扣減庫(kù)存,我們需要保障兩個(gè)系統(tǒng)都成功,才可以給用戶返回成功。對(duì)訂單系統(tǒng)來(lái)說(shuō)是一個(gè)事務(wù),對(duì)庫(kù)存系統(tǒng)來(lái)說(shuō),又是另外一個(gè)事務(wù)。在這里分布式事務(wù),要把訂單系統(tǒng)的事務(wù)和庫(kù)存系統(tǒng)事務(wù)看成一個(gè)事務(wù),要么一起成功,要么一起失敗。
實(shí)現(xiàn)分布式事務(wù)有三種基本方法:
- XA 二段式提交
- 三階段提交
- 基于消息的最終一致性方法。
我們想下,如果我們要執(zhí)行分布式事務(wù),需要多個(gè)系統(tǒng)事務(wù)都執(zhí)行成功,如果我們什么都不管,先發(fā) A 系統(tǒng),再發(fā) B 系統(tǒng),如果發(fā)送 A 系統(tǒng)后,執(zhí)行事務(wù)失敗的話直接返回失敗,那么如果 A 系統(tǒng)事務(wù)執(zhí)行成功;再發(fā) B 系統(tǒng)的時(shí)候,如果 B 系統(tǒng)事務(wù)成功很容易,如果 B 系統(tǒng)執(zhí)行事務(wù)失敗,我們又如何對(duì) A 系統(tǒng)進(jìn)行回滾操作那?如果讓程序來(lái)進(jìn)行處理,也不是不可能,不過(guò)就會(huì)很復(fù)雜,我們需要針對(duì)不同的情況來(lái)執(zhí)行不同操作。
2.1 XA 二段提交
我們?nèi)绻堰@兩個(gè)執(zhí)行事務(wù)的系統(tǒng)看成一個(gè)系統(tǒng),這整個(gè)系統(tǒng)支持分布式事務(wù),多個(gè)系統(tǒng)如果要整體對(duì)外一致的表現(xiàn),需要一個(gè)協(xié)調(diào)者,這個(gè)系統(tǒng)者有點(diǎn)像用戶代理,通過(guò)這個(gè)協(xié)調(diào)者來(lái)保障,那是不是還按照剛才的步驟來(lái),剛才的步驟有很大的失敗概率。比如訂單系統(tǒng)很可能成功的,但是庫(kù)存系統(tǒng)因?yàn)閹?kù)存的原因有一定的幾率會(huì)失敗,如果我們?cè)谡嬲峤恢?#xff0c;我們先進(jìn)行問(wèn)詢,在 XA 二階段中被稱(chēng)為問(wèn)詢階段。
XA 是一個(gè)分布式事務(wù)協(xié)議,規(guī)定了事務(wù)管理器和資源管理器接口。其實(shí)事務(wù)管理器就是我們說(shuō)的協(xié)調(diào)者,負(fù)責(zé)問(wèn)詢各節(jié)點(diǎn)事務(wù),向各個(gè)節(jié)點(diǎn)發(fā)起事務(wù)提交; 資源管理接口,是分布式事務(wù)參與者,通常由數(shù)據(jù)庫(kù)實(shí)現(xiàn)。
二階段提交協(xié)議(The two-phase commit protocol 2PC)像我們所說(shuō)的一樣,先要進(jìn)行問(wèn)詢(投票)和提交(commit)兩個(gè)階段。
協(xié)調(diào)者會(huì)向事務(wù)參與者發(fā)起執(zhí)行操作的 CanCommit 請(qǐng)求,等待參與者的響應(yīng)。參與者收到請(qǐng)求后,會(huì)執(zhí)行請(qǐng)求中的事務(wù)操作,記錄日志信息但是不提交,待參與者執(zhí)行成功,則向協(xié)調(diào)者發(fā)送 Yes,表示準(zhǔn)許執(zhí)行;如果不成功,則返回 No 消息,則表示終止操作。
當(dāng)所有的參與者都返回結(jié)果后,協(xié)調(diào)者進(jìn)入第二階段,如果都返回 yes,則向參與者發(fā)送 DoCommit 消息,參與者完成剩下的操作,并釋放資源,向協(xié)調(diào)者返回“HaveCommited”消息; 如果有一個(gè)參與者返回 No,則向所有參與者發(fā)送 DoAbort 消息,所有的參與者會(huì)做回滾操作,參與者向協(xié)調(diào)者發(fā)送“HaveCommited" 消息。
二階段提交順利的話,看起來(lái)很美好,但是實(shí)際上有不少問(wèn)題:
2.2 三階段提交
三階段提交是為了解決二階段的問(wèn)題:
2.2.1 CanCommit 階段
這個(gè)階段和 2PC 的第一個(gè)階段一樣類(lèi)似,判斷是否可以執(zhí)行事務(wù),然后返回是否可以順利執(zhí)行事務(wù)。
2.2.2 preCommit 階段
如果都回復(fù) Yes,則協(xié)調(diào)者進(jìn)行預(yù)提交:
2.2.3 docommit 階段
如果協(xié)調(diào)者從參與者都收到 ACK 消息:
如果協(xié)調(diào)者沒(méi)有收全所有參與者的成功返回,會(huì)執(zhí)行中斷事務(wù)操作。
2.3 利用分布式消息實(shí)現(xiàn)最終一致性
有些場(chǎng)合,數(shù)據(jù)一致性要求不一定要求這么嚴(yán)格,無(wú)論是兩階段提交還是三階段提交都無(wú)法解決鎖資源和數(shù)據(jù)最終不一致問(wèn)題。在只要求最終一致性場(chǎng)合,可以通過(guò)分布式消息來(lái)實(shí)現(xiàn)最終一致性。
其實(shí)我理解因?yàn)橥ㄟ^(guò)了分布式消息,一般會(huì)引入分布式消息隊(duì)列,這樣只要第一個(gè)系統(tǒng)得事務(wù)消息被持久了之后,后續(xù)的系統(tǒng)就算失敗了,還可以繼續(xù)重試;這樣異步方式實(shí)現(xiàn)最終一致性也有缺點(diǎn),就是返回了不代表整個(gè)事務(wù)都完成了,多個(gè)子系統(tǒng)什么時(shí)候一定可以完成事務(wù)是不確定的,當(dāng)然由于是異步處理的,所以系統(tǒng)的性能是最好的。
我們說(shuō)的數(shù)據(jù)一致性要求不是這么嚴(yán)格,有個(gè) BASE 理論專(zhuān)門(mén)來(lái)說(shuō)這個(gè)事情。基本可用(Basically Avaiable) 即出現(xiàn)故障時(shí)候,可以斷臂求生,其他功能還可以用。 (Soft state) 柔狀態(tài),準(zhǔn)許系統(tǒng)處于一個(gè)中間狀態(tài),等待最終同步為最終狀態(tài)。 (Eventual Consistency) 最終一致性事務(wù)在操作過(guò)程中數(shù)據(jù)存在同步延遲,但是最終狀態(tài)是一致的。
三 詩(shī)詞欣賞
《夢(mèng)游天姥吟留別》李白海客談瀛洲,煙濤微茫信難求。 越人語(yǔ)天姥,云霞明滅或可睹。天姥連天向天橫,勢(shì)拔五岳掩赤城。 天臺(tái)一萬(wàn)八千丈,對(duì)此欲倒東南傾。 我欲因之夢(mèng)吳越,一夜飛度鏡湖月。 湖月照我影,送我至剡溪。 謝公宿處今尚在,淥水蕩漾清猿啼。 腳著謝公屐,身登青云梯。 半壁見(jiàn)海日,空中聞天雞。 千巖萬(wàn)轉(zhuǎn)路不定,迷花倚石忽已暝。 熊咆龍吟殷巖泉,栗深林兮驚層巔。 云青青兮欲雨,水澹澹兮生煙。 列缺霹靂,丘巒崩摧。洞天石扉,訇然中開(kāi)。 青冥浩蕩不見(jiàn)底,日月照耀金銀臺(tái)。 霓為衣兮風(fēng)為馬,云之君兮紛紛而來(lái)下。 虎鼓瑟兮鸞回車(chē),仙之人兮列如麻。 忽魂悸以魄動(dòng),恍驚起而長(zhǎng)嗟。 惟覺(jué)時(shí)之枕席,失向來(lái)之煙霞。 世間行樂(lè)亦如此,古來(lái)萬(wàn)事東流水。 別君去兮何時(shí)還,且放白鹿青崖間, 須行即騎訪名山。安能摧眉折腰事權(quán)貴, 使我不得開(kāi)心顏。總結(jié)
以上是生活随笔為你收集整理的plsql清完表需不需要提交事务_分布式基础-分布式事务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python alpha_如何用Pyth
- 下一篇: python获取中文字体点阵坐标_点阵汉