分布式事務(wù)鎖特殊情況強(qiáng)制處理方法
點(diǎn)擊上方“IT那活兒”公眾號(hào),關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了?。?!
通過(guò)建立知識(shí)庫(kù)管理,積累、保存信息和知識(shí)資產(chǎn),為團(tuán)隊(duì)內(nèi)部信息和知識(shí)的傳播提供平臺(tái),實(shí)現(xiàn)團(tuán)隊(duì)內(nèi)知識(shí)共享,也使得企業(yè)知識(shí)得到很好的精煉和沉淀。
分布式事務(wù),簡(jiǎn)單來(lái)說(shuō),是指一個(gè)事務(wù)在本地和遠(yuǎn)程執(zhí)行,本地需要等待確認(rèn)遠(yuǎn)程的事務(wù)結(jié)束后,進(jìn)行下一步本地的操作。如通過(guò)dblink update遠(yuǎn)程數(shù)據(jù)庫(kù)的一行記錄,如果在執(zhí)行過(guò)程中網(wǎng)絡(luò)異常,或者其他事件導(dǎo)致本地?cái)?shù)據(jù)庫(kù)無(wú)法得知遠(yuǎn)程數(shù)據(jù)庫(kù)的執(zhí)行情況,此時(shí)就會(huì)發(fā)生in doublt的報(bào)錯(cuò)。當(dāng)前的分布式事務(wù)處于Two-Phase Commit機(jī)制中的prepared階段,這個(gè)階段事務(wù)已經(jīng)在表上加鎖了,現(xiàn)在我們要訪問(wèn)這些表,但事務(wù)沒(méi)有結(jié)束,一直持有鎖,導(dǎo)致訪問(wèn)資源失敗報(bào)ORA-01591。分布式事務(wù)所持有的鎖之所以堵塞讀操作,是因?yàn)閛ralce不知道該顯示哪個(gè)版本的數(shù)據(jù)。當(dāng)一個(gè)分布式事務(wù)死掉時(shí),由于該事務(wù)沒(méi)有正常結(jié)束,導(dǎo)致事務(wù)持有的鎖一直沒(méi)有釋放,所以在訪問(wèn)這個(gè)事務(wù)涉及的資源時(shí),申請(qǐng)不到鎖資源,所以報(bào)ORA-01591。ORA-01591錯(cuò)誤一般是由于分布式事務(wù)造成的,造成分布式事務(wù)失敗的原因可能是庫(kù)之間的網(wǎng)絡(luò)突然中斷或者更新操作窗口會(huì)話被斷開(kāi),造成兩個(gè)庫(kù)中的事務(wù)信息不一致,導(dǎo)致有殘余的分布式事務(wù)信息未被釋放。任何事務(wù)都有特殊情況,分布式事務(wù)鎖的一般性解決方案是直接進(jìn)行回滾,或等待網(wǎng)絡(luò)自動(dòng)連接后數(shù)據(jù)庫(kù)自動(dòng)調(diào)配解決;特殊情況下當(dāng)強(qiáng)制回滾無(wú)法相應(yīng)時(shí),還有兩個(gè)備用操作可以解決——重啟數(shù)據(jù)庫(kù)與修改數(shù)據(jù)庫(kù)基表數(shù)據(jù)。但后者修改基表的風(fēng)險(xiǎn)是比較大的,慎用?。。?/strong>
3.1 重啟數(shù)據(jù)庫(kù)自動(dòng)解決風(fēng)險(xiǎn):對(duì)于業(yè)務(wù)數(shù)據(jù)庫(kù)來(lái)說(shuō),重啟之后如果其上的業(yè)務(wù)無(wú)法自動(dòng)轉(zhuǎn)移到另一個(gè)集群節(jié)點(diǎn)上,那么會(huì)對(duì)業(yè)務(wù)運(yùn)行造成影響,更進(jìn)一步的,會(huì)對(duì)其他與之關(guān)聯(lián)的數(shù)據(jù)庫(kù)業(yè)務(wù)也造成影響。因此這種風(fēng)險(xiǎn)的重點(diǎn)在于風(fēng)險(xiǎn)擴(kuò)散。兩階段提交協(xié)議可以保證數(shù)據(jù)的強(qiáng)一致性,許多分布式關(guān)系型數(shù)據(jù)管理系統(tǒng)采用此協(xié)議來(lái)完成分布式事務(wù)。它是協(xié)調(diào)所有分布式原子事務(wù)參與者,并決定提交或取消(回滾)的分布式算法。同時(shí)也是解決一致性問(wèn)題的算法。該算法能夠解決很多的臨時(shí)性系統(tǒng)故障(包括進(jìn)程、網(wǎng)絡(luò)節(jié)點(diǎn)、通信等故障),被廣泛地使用。但是,它并不能夠通過(guò)配置來(lái)解決所有的故障,在某些情況下它還需要人為的參與才能解決問(wèn)題。兩階段提交分為Prepare Phase (準(zhǔn)備階段)和Commit Phase (提交階段)。對(duì)數(shù)據(jù)庫(kù)基表pending_trans$和pending_sessions$錄入分布式事務(wù)的相關(guān)數(shù)據(jù),提交數(shù)據(jù)后對(duì)該事務(wù)也進(jìn)行提交,偽造該分布式事務(wù)已經(jīng)完成的記錄,從而使得該鎖能夠成功釋放。3)風(fēng)險(xiǎn):官方一般不建議修改數(shù)據(jù)庫(kù)基表信息,基表屬于oracle后端表,修改基表相當(dāng)于數(shù)據(jù)欺騙,人為干預(yù)本該數(shù)據(jù)庫(kù)可以自動(dòng)完成的過(guò)程,可能導(dǎo)致數(shù)據(jù)不一致,數(shù)據(jù)混亂,或者基表數(shù)據(jù)異常進(jìn)而影響其他事務(wù)執(zhí)行。慎用??!*對(duì)基表pending_trans$和pending_sessions$手動(dòng)錄入事務(wù)3128.22.4729750的數(shù)據(jù)。*數(shù)據(jù)錄入完成后對(duì)表數(shù)據(jù)提交,同時(shí)對(duì)該事務(wù)進(jìn)行強(qiáng)制commit,偽造成該事務(wù)已完成的記錄。提交完成后該分布式事務(wù)鎖便可解開(kāi)。*由于該事務(wù)的執(zhí)行記錄是偽造的,因此還需清除本地?cái)?shù)據(jù)庫(kù)所記載的遠(yuǎn)程事務(wù)入口,該事務(wù)入口操作因?yàn)檫h(yuǎn)程數(shù)據(jù)庫(kù)問(wèn)題未能在遠(yuǎn)程數(shù)據(jù)庫(kù)完成。即在事務(wù)鎖解開(kāi)后清除該條偽造的事務(wù)數(shù)據(jù)記錄。完成后便可正常對(duì)表進(jìn)行操作。本文作者:陳炎亮(上海新炬王翦團(tuán)隊(duì))
本文來(lái)源:“IT那活兒”公眾號(hào)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/129154.html