通過上一篇的介紹,我們知道了SOA真正需要的是一個能夠協調服務操作直接(通過服務自身訪問的 資源)或者間接(通過被調用服務訪問的資源)訪問的所有資源的分布式事務管理系統,這是一個復雜 的架構體系。WCF,作為Windows平台下基於SOA的分布式框架,對分布式事務提供全面的支持。不過, WCF並不是另起爐灶,而是充分地利用了Windows現有的事務控制基礎架構。本節著重討論Windows事務處 理模型,首先來看看在這個模型中各個事務參與者各自扮演怎樣的角色。
對於所有的事務參與者,按照各自在整個事務生命周期各個階段所承擔的職能,大致扮演著如下三種 角色:
* 應用(Application)、服務(Service)或者組件(Component):代表用戶程序,或者是承載著 某功能的服務(Service)或者組件(Component);
* 資源管理器(RM:Resource Manager):代表用於管理具體事務型資源的軟件程序,比如數據庫或 者隊列(MSMQ)等;
* 事務管理器(TM: Transaction Manager):代表管理整個事務的中間件程序,為應用和資源管理 器提供基本的事務控制服務。
一、應用(Application)、服務(Service)和組件(Component)
事務最終為用戶程序、服務和組件服務的,後者利用了事務這種特殊的機制將一組相關的操作作為一 個不可分割的整體來執行,從而確保了數據的一致性。在整個模型中,應用(服務或者應用,為了敘述 簡練,後續部分關於應用、服務和組件都簡稱為應用)主要負責如下一些事務相關的任務:
* 開始事務:事務開始的驅動者總是應用,但是並不是所有的應用都會開始一個新的事務,只有最初 的應用才才是事務的開啟者;
* 事務的奉送(Marshaling)和傳播(Propagation):將應用的本地事務封送、傳播給另一個應用 或者資源管理器;
* 提交事務:事務的開啟者同時也是事務最終的提交者,當事務相關的操作順利完成後,最初開啟事 務的應用會提交該事務。
二、資源管理器(RM:Resource Manager)
在事務控制模型中,不論是應用還是資源管理器都不是直接地訪問具體的事務型資源,而是通過一個 中介間接地對目標資源進行操作,這個中介就是資源管理器。按照目標資源是否可被持久化,可以將相 應的資源管理器分為如下兩類:
* 持久化資源管理器(Durable Resource Manager):用於管理持久化資源,比如數據庫和MSMQ,當 事務回滾得時候,具有可恢復性(Recovery);
* 易失資源管理器(Volatile Resource Manager):用於管理像內存數據這樣的不會被持久化的易 失資源,易失資源不具有可以恢復性。
在後面介紹的實現分布式事務的兩階段提交(2PC: Two-Phase Commit)協議中,對於這兩種不同的 資源管理器,采用不同的登記(Enlist)方式。總的來說,資源管理器在整個事務模型中主要承擔如下 幾種職能:
* 幫助應用實現對目標資源的操作;
* 注冊到相應的事務管理器,以便事務回滾得時候可以從事務管理器中接收到恢復請求,實現對數據 的恢復;
* 向相應的事務管理器報告本地事務的結果;
三、事務管理器(Transaction Manager)
事務管理器是整個事務控制模型的核心和樞紐,是它控制著事務的所有參與者,協調整個事務從開始 到完成的所有相關處理流程。事務管理器為應用和資源管理器提供一系列核心的事務性的服務,實現事 務的開始、提交和回滾。Windows提供了三種不同的事務管理器,我們現在對它們進行逐個介紹。
1、輕量級事務管理器(LTM: Lightweight Transaction Manager)
正如其名稱隱含的意思,輕量級事務管理器(以下簡稱LTM)具有最小的負載,是性能最高的事務管理 器。LTM的作用范圍僅限於開啟事務的應用程序域(AppDomain)中,並且登記到事務中的持久化資源 (Durable Resource)數量不能超過一個。
一般地,被開啟的事務就由LTM管理,如果事務涉及到跨應用程序域的操作,當前的事務回被奉送、 傳播到另一個執行上下文中,此時事務將脫離LTM的管轄。此外,基於LTM的事務中可以同時登記 (Enlist)多個易失型資源(Volatile),但是僅僅允許登記唯一一個持久化資源。當第二個持久化資 源被登記到當前事務中,該事務也將脫離LTM的管轄。
並不是所有的持久化資源都可以登記到LTM,實際上到目前為止,能夠登記到LTM這麼一個高性能的事 務管理器的事務型資源僅僅限於SQL Server 2005和SQL Server 2008,即使是同屬於Windows平台下SQL Server 2000和MSMQ均不支持LTM,更不用說Oracle和DB2。我們希望微軟能夠和其他的廠商進行合作,讓 第三方開發的事務型資源也能利用LTM性能的優勢。
2、內核事務管理器(KTM:Kernel transaction Manager)
內核事務管理器(以下簡稱KTM)在Windows Vista中被引入,並被用於後續的Windows Server 2008 和Windows 7。引入KTM的主要的目的在於實現將文件管理和注冊表管理納入事務的范疇。借助於KTM,我 們可以以事務的方式操作NTFS文件系統下的文件資源,以及注冊表資源。我們將支持事務的文件系統和 注冊表成為事務型的文件系統(TxF)和事務型注冊表(TxR)。
之所以被稱為內核事務管理器,使因為基於KTM的事務控制引擎運行在內核模式(Kernel Mode),而 不是用戶模式(User Mode)下。和LTM一樣,KTM對易失型事務資源沒有限制,卻至於單一的持久化事務 資源被涉及。
從上面的介紹我們不難看出,無論是LTM還是KTM,其管轄范圍僅限於本地事務,對於分布式事務卻無 能為力。分布式事務依賴於一個更為強大的事務管理器,就是我們接下來著重介紹的分布式事務協調器 。
3、分布式事務協調器(DTC:Distributed Transaction Coordinator)
對於分布式事務協調器,我們大都簡稱為DTC,或者MS DTC,以下我們直接簡稱DTC。DTC用於管理跨 邊界(跨應用程序域、進程、機器以至跨網絡)執行的分布式事務,它采用相應的事務管理協議,比如 Ole-Tx和WS-Atomic Transaction(WS-AT),協調一個分布式事務中的所有參與者。
每一台機器上具有一個唯一的DTC,事務涉及的承載於某台機器的所有事務型資源均由當前機器的DTC 管理。當事務跨越多台機器時,它們各自的DTC需要按照相應的協議相互協作,實現對整個事務的一致性 管理。
4、事務提升(Transaction Promotion)
以上我們介紹了三種不同的事務管理器類型,從功能上講,DTC能夠協調、管理一個分布式事務涉及 的所有事務型資源,而不管具體的資源分布於何處。但是,由於其事務控制的復雜性(一般采用兩階段 提交協議)並需要進行跨進程、跨機器甚至跨網絡通信,在性能上無疑是最差的。所以,我們不可能在 任何事務場景中都采用 DTC,所謂“牛刀雖好、不便殺雞”,我們應該根據事務控制的需要選擇性能最 高的事務管理器。
但是,事務是一個動態執行的操作序列,系統不可能預知完整執行整個事務所有操作後的資源登記情 況,所以不可以預先為其指定一個為相應事務多身定制的事務管理器。相反地,只能在事務具體的執行 過程中,動態地選擇最適合當前事務執行情況的事務管理器。Windows采用事務提升的機制進行事務管理 器的選擇。
一般情況下,事務開始的時候,LTM默認被作為當前的事務管理器。隨著事務操作的逐步執行,如何 該事務涉及到對某個內核事務資源的訪問,那麼自動提升到基於KTM的事務。無論是基於LTM還是KTM的事 務,在當出現如下兩種情況的時候,會向基於DTC事務提升:
* 事務操作涉及到對多個LTM資源的訪問或者訪問的資源不被LTM支持:比如說,當事務應用開啟兩個 基於SQL Server 2008(LTM事務型資源)的連接進行數據存取;或者,訪問開啟一個基於Oracle(非LTM 事務型資源)的連接進行數據存取;
* 當前事務被跨應用程序域封送(Marshaling):比如說,放一個服務調用另一個服務的時候,將當 前事務進行序列化以實現向被調用服務方傳播。
由於WCF的事務體系解決的是事務在服務之間的流轉,以及對服務操作直接或者間接訪問的所有事務 型資源的協作,這樣的事務時通過基於DTC的分布式事務實現的。接下來,我們就來簡單討論一下《基於 DTC的分布式事務實現的》。
出處:http://artech.cnblogs.com