標籤:style blog http color io 使用 ar strong for
因為事務需要實現ACID,即原子性、一致性、隔離性、持久性,所以需要採用一定的機制來保證,通常採用的是分階段提交的方式。
XA:XA協議,規定交易管理員和資源管理員介面,採用二階段提交協議。
一階段提交協議
一階段提交協議相對簡單,如:
當然,前提是開啟了事務,然後在應用程式發出提交/復原請求後,資料庫執行操作,而後將成功/失敗返回給應用程式,程式繼續執行。
一階段提交協議相對簡單,簡單帶來的優點就是,它不用再與其他的對象互動,節省了判斷步驟和時間,所以在效能上是在階段提交協議中對好的。
二階段提交協議
一階段提交協議有其優點,但缺點也很明顯:
- 資料庫確認執行事務的時間較長,出問題的可能性就隨之增大。
- 如果有多個資料來源,一階段提交協議無法協調他們之間的關係。
所以在一階段協議的基礎上,有了二階段協議,二階段協議的好處是添加了一個管理者角色,如下:
很明顯,二階段協議通過將兩層變為三層,增加了中間的管理者角色,從而協調多個資料來源之間的關係,二階段提交協議分為兩個階段。
第一階段
應用程式調用了交易管理員的提交方法,此後第一階段分為兩個步驟:
- 交易管理員通知參與該事務的各個資源管理員,通知他們開始準備事務。
- 資源管理員接收到訊息後開始準備階段,寫好交易記錄並執行事務,但不提交,然後將是否就緒的訊息返回給交易管理員(此時已經將事務的大部分事情做完,以後的內容耗時極小)。
第二階段
第二階段也分為兩個步驟:
- 交易管理員在接受各個訊息後,開始分析,如果有任意其一失敗,則發送復原命令,否則發送提交命令。
- 各個資源管理員接收到命令後,執行(耗時很少),並將提交訊息返回給交易管理員。
交易管理員接受訊息後,事務結束,應用程式繼續執行。 為什麼要分兩步執行?一是因為分兩步,就有了交易管理員統一管理的機會;二儘可能晚地提交事務,讓事務在提交前儘可能地完成所有能完成的工作,這樣,最後的提交階段將是耗時極短,耗時極短意味著操作失敗的可能性也就降低。
同時,二階段提交協議為了保證事務的一致性,不管是交易管理員還是各個資源管理員,每執行一步操作,都會記錄日誌,為出現故障後的恢複準備依據。 二階段提交協議的存在的弊端是阻塞,因為交易管理員要收集各個資源管理員的響應訊息,如果其中一個或多個一直不返回訊息,則交易管理員一直等待,應用程式也被阻塞,甚至可能永久阻塞。事務與協議 那麼本地事務和分散式交易,分別採用的是哪些協議?我在RedBooks的一個文檔中看到的是:
Global transactions
Although the XAResource interface is intended to support two phase commit, the specification does not force an adapter to support two phase commit. However, if the resource adapter does implement XAResource it must also implement support for one phase commit. This allows the transaction manager to do one phase commit optimization (explained later) by setting the onePhase flag to true when doing acommit.……
Local transactions
A local transaction is managed by the resource manager without the need for an
external transaction manager, and can be utilized when only one resource is
involved.
Local transactions only support one phase commit, because they only
reference one EIS.……
大意是:雖然實現XA介面的目的是為了支援二階段提交協議,但是它也支援一階段提交協議。本地事務只支援一階段提交;分散式交易預設採用的是二階段提交,如果在分散式交易中非得使用一階段提交協議,那麼只要資料來源多餘一個就會拋出異常,如果只有一個資料來源則正確執行。總結 一階段提交協議和二階段提交協議只是比較常用的兩個,此外還有其他協議,可自行研究。
事務的一階段提交協議和二階段提交協議