WCF事務(wù)是維持系統(tǒng)一致性并合理實(shí)現(xiàn)錯(cuò)誤恢復(fù)的最好方法,這也是WCF事務(wù)的意義,事務(wù)具有原子性、一致性、隔離性、和持久性,其他的管理方式是使用類似ADO.NET的編程模型來
管理。因?yàn)槭聞?wù)協(xié)調(diào)的問題(尤其在分布式事務(wù)上),WCF使用了一個(gè)叫“兩階段提交事務(wù)管理協(xié)議”,在第一階段事務(wù)管理器詢問參與事務(wù)的資源,了解提交修改記錄時(shí)是否有所
保留,在第二階段,如果第一階段投票要求提交事務(wù),則事務(wù)管理器將通知修改,反之,則會(huì)滾所作修改。
事務(wù)傳播
為了實(shí)現(xiàn)事務(wù)傳播,則必須啟用綁定,方法是在宿主配置文件中將TransactionFlow設(shè)置為true.
WCF還提供了TransactionFlowAttribute方法特性,控制客戶端是否將事務(wù)傳播到服務(wù),他包含如下定義:
TransactionFlowAttribute.NotAllowed,客戶端禁止事務(wù)流
TransactionFlowAttribute.Allowed,允許但不肯定
TransactionFlowAttribute.Mandatory,必須使用事務(wù)流
事務(wù)協(xié)議
根據(jù)事務(wù)參與放執(zhí)行范圍,WCF會(huì)提供不同事務(wù)管理協(xié)議,有輕量級協(xié)議、OleTx協(xié)議、WS原子性協(xié)議,輕量級協(xié)議為程序級協(xié)議,即只能在程序域中使用事務(wù)傳播,OleTX為機(jī)器級
協(xié)議,只能在本地計(jì)算機(jī)傳播,WS原子協(xié)議使用HTTP協(xié)議可以跨Internet。
TCP,IPC默認(rèn)使用OleTx協(xié)議,我們可以在配置文件的綁定中定義:transactionProtocol=“WSAtomicTransactionOctober2004”轉(zhuǎn)換為WS原子性協(xié)議。
事務(wù)管理器
WCF為我們提供第三方的事務(wù)管理器,來管理事務(wù)。這三個(gè)事務(wù)管理器分別是:輕量級事務(wù)管理器(LTM)、核心事務(wù)管理器(KTM)、分布式事務(wù)協(xié)調(diào)器(DTC),WCF能動(dòng)態(tài)的為我
們分配管理器,當(dāng)一個(gè)管理器不能滿足需求,WCF就會(huì)請求上一級的管理器來處理問題。
聲明事務(wù)
當(dāng)明白了上面的內(nèi)容,我們還需要聲明事務(wù),為了擁有一個(gè)事務(wù),WCF必須標(biāo)識每個(gè)契約方法,方法是設(shè)置TransactionScopeRequired=true,如:
Class Myservice:IMyContract
{
[OperationBehavior(TransactionScopeRequired=true)]
Public void MyMethod()
{
Transaction transaction=Transaction.Current;//獲取一個(gè)環(huán)境事務(wù)的引用
Debug.Assert(transaction!=null)//如果為空,則環(huán)境事務(wù)不存在
}
}
事務(wù)的傳播模式
不同的綁定事務(wù)流屬性(TransactionFlow)、契約中的事務(wù)流選項(xiàng)(TransactionFlowAttribute)、事務(wù)范圍屬性(TransactionScopeRequired)決定了事務(wù)將以何種模式進(jìn)行傳
播,根據(jù)不同組合,可得到Client/Service、Client、Service、None四種不同的情況(具體配置方法參照《Programming WCF Services》中的介紹),Client/Service能使用客戶
端的事務(wù),Client必須使用客戶端事務(wù),Service則確保服務(wù)必須有一個(gè)事務(wù),None則永遠(yuǎn)不使用事務(wù)
投票完成事務(wù)
前面已經(jīng)學(xué)習(xí)了WCF的服務(wù)傳播方法,但是卻不知道WCF的事務(wù)何時(shí)提交或何時(shí)終止,所以我們投票決定事務(wù)的完成方式,WCF提供了自動(dòng)和顯式兩種投票方式:
1,自動(dòng)投票:
事務(wù)投票只需要在聲明事務(wù)時(shí),再聲明TransactionAutoComplete值為true即可,如:
[OperationBehavior(TransactionScopeRequired=true,TransactionAutoComplete=true)]
Public void MyMethod()
{
}
2.顯式投票:
顯式投票首先關(guān)閉自動(dòng)投票,即TransactionAutoComplete=false,
在服務(wù)操作返回結(jié)果前使用OperactionContext.Current.SetTransactionComplete();
事務(wù)的屬性
事務(wù)可以設(shè)置隔離級別和超時(shí)時(shí)間,分別為設(shè)置ServiceBehavior的TransactionIsolationLevel和TransactionTimeout的值