【DB筆試面試690】在Oracle中,什麼是分散式事務處理?
- 2019 年 11 月 24 日
- 筆記
♣
題目部分
在Oracle中,什麼是分散式事務處理?
♣
答案部分
現代資料庫系統往往伴隨著複雜的結構和環境,其中,分散式資料庫組成是一個重要方面。系統後台的資料庫系統不再是由單個資料庫構成,而是由多台獨立資料庫、甚至是多台異構資料庫構成。
分散式事務是指一個事務在本地和遠程執行,本地需要等待確認遠程的事務結束後,進行下一步本地的操作。如通過DBLINK更新遠程資料庫的一行記錄,如果在執行過程中網路異常,或者其它事件導致本地資料庫無法得知遠程資料庫的執行情況,那麼此時就會發生IN-DOUBT的報錯。此時需要DBA介入,且需要分多種情況進行處理。
Oracle會自動處理分散式事務,保證分散式事務的一致性,所有站點全部提交或全部回滾。一般情況下,處理過程在很短的時間內完成,根本無法察覺到。但是,如果在COMMIT或ROLLBACK的時候,出現了連接中斷或某個資料庫站點Crash的情況,那麼提交操作可能會無法繼續,此時DBA_2PC_PENDING和DBA_2PC_NEIGHBORS中會包含尚未解決的分布事務。對於絕大多數情況,當恢復連接或Crash的資料庫重新啟動後,會自動解決分散式事務,不需要人工干預。只有分布事務鎖住的對象急需被訪問,鎖住的回滾段阻止了其它事務的使用,網路故障或Crash的資料庫的恢復需要很長的時間等情況出現時,才使用人工操作的方式來維護分散式事務。手工強制提交或回滾將失去二層提交的特性,Oracle無法繼續保證事務的一致性,事務的一致性應由手工操作者保證。
使用「ALTER SYSTEM DISABLE DISTRIBUTED RECOVERY;」可以使Oracle不再自動解決分布事務,即使網路恢復連接或者CRASH的資料庫重新啟動。使用「ALTER SYSTEM ENABLE DISTRIBUTED RECOVERY;」恢復自動解決分布事務。
有關分散式事務有兩個重要的視圖,分別是DBA_2PC_PENDING和DBA_2PC_NEIGHBORS。DBA_2PC_PENDING視圖列出所有的懸而未決的事務,此視圖在未填入懸而未決的事務之前是空的,解決之後也被清空。如下所示:
表 3-26 DBA_2PC_PENDING解釋
列名 |
說明 |
---|---|
LOCAL_TRAN_ID |
本地事務標識,格式為INTEGER.INTEGER.INGEGER。當一個連接的LOCAL_TRAN_ID和GLOBAL_TRAN_ID相同時,該節點是該事務的全局協調器。 |
GLOBAL_TRAN_ID |
全局事務標識,格式為:GLOBAL_DB_NAME.DB_HEX_ID.LOCAL_TRAN_ID,其中DB_HEX_ID是用來標識資料庫八字元的十六進位數,全局事務各ID在分散式事務的每個節點都是相同的。 |
STATE |
見表 3-27 DBA_2PC_PENDING的STATE列的說明 |
MIXED |
「YES」意味著一部分事務已經在一個節點上提交,而在另一個節點上被回滾。 |
TRAN_COMMENT |
事務的注釋,或者如果使用了事務命名,當事各被提交時,那麼事務的名字就會出現在此處 |
HOST |
主機名 |
COMMIT# |
已提交的事務的全局提交數 |
表 3-27 DBA_2PC_PENDING的STATE列的說明
列值 |
說明 |
---|---|
Connecting |
通常情況下,只有全局協調器和本地協調器才使用這個條目,節點在能夠決定它是否能夠準備好之前,要收集來自於其它資料庫服務的資訊。 |
Prepared |
節點已准好,可能或者也可能沒有將已準備好的消息通知本地協調器,但此時,該節點還沒有接收到提交的請求,仍保持著准許備好的狀態,控制著提交事務所必需的任何本地資源。 |
Commited |
節點(任何類型)已經提交了事務,但該事務所包含的其它節點可能並沒有提交,也就是該事務在一個個或多個其它節點上仍然是懸而未決。 |
Forced commit |
DBA進行判斷後,可以強行提交未決的事務,如果一個事務由DBA在本地節點進行手動提交時,產生此項目。 |
Forced abor(rollback) |
DBA進行判斷後,可以強行回滾未決的事務,如果一個事務由DBA在本地節點進行手動回滾時,產生此項目。 |
另一個視圖是DBA_2PC_NEIGHBORS,該視圖列出所有獲得的(從遠程客戶)和送出的(給遠程伺服器)懸而未決的事務,也表示該本地節點是不是事務的提交點站點。
表 3-28 DBA_2PC_NEIGHBORS
列名 |
說明 |
---|---|
LOCAL_TRAN_ID |
同上。 |
IN_OUT |
獲得事務為IN,送出事務為OUT。 |
Database |
對獲得事務來說指本地節點資訊的客戶資料庫的名稱;對送出的事務來說指用於訪問遠程伺服器上資訊的資料庫鏈接的名稱。 |
DBuser_owner |
對獲得事務來說指遠程資料庫鏈接用於連接的本地賬戶;對於送出事務來說指該資料庫鏈接的擁有者。 |
INTERFACE |
「C」代表提交資訊,「N」表示已準備好狀態的一條消息或是一條請求只讀提交的請求。當「IN_OUT」為OUT時,「C」表示該連接的遠程的站點是提交點站點,並且知道是提交還是中斷。「N」表示本地節點正在通知遠程節點,說它已準備好。當「IN_OUT」為IN時,「C」表示本地節點或送出的遠程的一個資料庫是提交點站點,「N」表示本地節點正在通知遠程節點,說它已準備好。 |
本文選自《Oracle程式設計師面試筆試寶典》,作者:小麥苗
About Me:小麥苗
● 本文作者:小麥苗,只專註於資料庫的技術,更注重技術的運用
● 作者部落格地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列題目來源於作者的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解
● 版權所有,歡迎分享本文,轉載請保留出處
● QQ:646634621 QQ群:618766405
● 題目解答若有不當之處,還望各位朋友批評指正,共同進步