oracle分散式事務

victorymoshui發表於2011-12-16
基本概念

  Local Coordinator:在分佈事務中,必須參考其它節點上的資料才能完成自己這部分操作的站點。

  Global Coordinator:分佈事務的發起者,負責協調這個分佈事務。

  Commit Point Site:在分佈事務中,首先執行COMMIT或ROLLBACK操作的站點。一般情況下,應該把儲存關鍵資料的站點作為Commit Point Site。因為Commit Point Site和其它站點不一樣,從來不會進入prepared狀態,所以不會存在IN-DOUBT事務。

  可以設定初始化引數COMMIT_POINT_STRENGTH,在分散式事務中,會根據這 個值的大小來確定Commit Point Site,分佈事物的狀態資訊也存在該資料庫中。一般將關鍵的資料庫作為commit point site ,commit_point_strength值較高的資料庫為commit point site,在分佈事物中最先提交

  分散式提交的3個階段

  分佈事物的兩階段提交分三個過程:

  1. 準備階段(PREPARE PHASE)

  ·本地資料庫Global Coordinator向其它資料庫發出COMMIT通知

  ·比較所有資料庫的SCN號,將最高的SCN號作為分佈事物的全域性SCN號

  ·所有資料庫寫線上日誌

  ·對分佈事物修改的表加分佈鎖,防止被讀寫

  ·各資料庫向Global Coordinator發出已經準備好的通知

  所有參與分佈事物的資料庫必須經過上述準備,才能進入下一階段。

  2. 提交階段(COMMIT PHASE)

  ·本地資料庫Global Coordinator通知commit point site首先提交。commit point site提交後,釋放其佔有的資源,通知Global Coordinator完成提交

  ·本地資料庫Global Coordinator通知其它資料庫提交

  ·提交節點在日誌中追加一條資訊,表示分佈事物已經完成提交,並通知Global Coordinator。此時所有資料庫的資料保持了一致性。

  3. 登出階段(FORGET PHASE)

  ·本地資料庫Global Coordinator通知commit point site所有資料庫已經完成提交

  ·commit point site清除分佈事物的記錄和狀態資訊,並通知Global Coordinator

  ·Global Coordinator清除本地分佈事物的記錄和狀態資訊

  此時分佈事物的兩階段提交全部完成。

  如果兩階段提交完成之前,資料庫或網路出現異常,應用就會報錯,分佈事物處於IN_DOUBT狀態。一旦資料庫或網路恢復正常,系統(RECO PROCESS)會自動處理IN_DOUBT狀態的分佈事物。有些情況需要管理員手工處理IN_DOUBT狀態的分佈事物:

  ·IN_DOUBT狀態的分佈事物,將關鍵表鎖住,造成應用不能正常工作

  兩個重要的檢視

  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在分散式事務的每個節點都是相同的。

  “YES”意味著一部分事務已經在一個節點上提交﹐而在另一個節點上被回滾。

  TRAN_COMMENT

  事務的註釋﹐或者如果使用了事務命名﹐當事各被提交時﹐事務的名字就會出現在此處

  已提交的事務的全域性提交數

  DBA_2PC_PENDING的STATE列的說明

 Connecting

  通常情況下﹐只有全域性協調器和本地協調器才使用這個條目﹐節點在能夠決定它是否能夠準備好之前﹐要收集來自於其它資料庫服務的資訊。

  節點已準好﹐可能或者也可能沒有將已準備好的訊息通知本地協調器﹐但此時﹐該節點還沒有接收到提交的請求﹐仍保持著准許備好的狀態﹐控制著提交事務所必需的任何本地資源。

  節點(任何型別)已經提交了事務﹐但該事務所包含的其它節點可能並沒有提交﹐也就是該事務在一個個或多個其它節點上仍然是懸而未決 。

  Forced commit

  DBA進行判斷後﹐可以強行提交未決的事務﹐如果一個事務由DBA在本地節點進行手動提交時﹐產生此專案

  Forced abor(rollback)

  DBA進行判斷後﹐可以強行回滾未決的事務﹐如果一個事務由DBA在本地節點進行手動回滾時﹐產生此專案

  DBA_2PC_NEIGHBORS:列出所有獲得的(從遠端客戶)和送出的(給遠端伺服器)懸而未決的事務﹐也表示該本地節點是不是事務的提交點站點。

  LOCAL_TRAN_ID

  對獲得事務來說指本地節點資訊的客戶資料庫的名稱﹔對送出的事務來說指用於訪問遠端伺服器上資訊的資料庫連結的名稱

  DBuser_owner

  對獲得事務來說指遠端資料庫連結用於連線的本地賬戶﹔對於送出事務來說指該資料庫連結的擁有者。

  INTERFACE

  ‘C’代表提交資訊﹐’N’表示已準備好狀態的一條訊息或是一條請求只讀提交的請求。

  當’IN_OUT’為OUT時﹐’C’表示該連線的遠端的站點是提交點站點,並且知道是提交還是中斷。’N’表示本地節點正在通知遠端節點﹐說它已準備好。

  當’IN_OUT’為IN時﹐‘C’表示本地節點或送出的遠端的一個資料庫是提交點站點﹐’N’表示本地節點正在通知遠端節點﹐說它已準備好。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9390331/viewspace-713465/,如需轉載,請註明出處,否則將追究法律責任。

相關文章