假的分布式事務(wù):
using tr as new transaction
call_service_a()
call_service_b()
tr.complete()
end using
在一臺機(jī)器上,實(shí)現(xiàn)客戶端事務(wù),也就是說在客戶端調(diào)用上述代碼,那么如果你的DTC服務(wù)未配置或者說禁用了DTC配置,會出現(xiàn)“與基礎(chǔ)事務(wù)管理器的通信失敗”的錯誤。如果設(shè)置了DTC服務(wù),那么(不管啟動沒啟動,如果沒啟動,系統(tǒng)會自己啟動DTC),都可以實(shí)現(xiàn)事務(wù)控制。如果只是調(diào)用一個(gè)操作,那么不會啟動DTC,應(yīng)該是因?yàn)榈粲昧藘蓚€(gè)conn的操作,所以啟用了DTC。
這并不能算真正的分布式事務(wù),為了實(shí)現(xiàn)分布式事務(wù),還得做一番手腳:
真正的分布式實(shí)驗(yàn):
如果要在異構(gòu)的系統(tǒng)中實(shí)現(xiàn)A.Add() ;B.Add(),那么如果沒有配置任何東西,在調(diào)用的時(shí)候會出現(xiàn)“調(diào)用方未由服務(wù)進(jìn)行身份驗(yàn)證”。網(wǎng)上有些方法是配置:binding.Security.Mode = SecurityMode.None;但是,這 是一種無奈的方法。
這需要使用WS-AT協(xié)議,具體過程如下:
1. 選擇支持事務(wù)的綁定,我用的是 wsHttpBinding
2. 在配置文件(web.config)的綁定設(shè)置中 transactionFlow ="true"
3. 在服務(wù)接口中設(shè)定方法屬性:<TransactionFlow(TransactionFlowOption.Mandatory)>
4. 在服務(wù)類中設(shè)定方法屬性:<OperationBehavior(TransactionScopeRequired:=True)>
5. 在客戶端的 Winform UI 中使用代碼:
using tr as new transaction
call_service_a()
call_service_b()
tr.complete()
end using
6. 配置 MSDTC,請參考 http://msdn.microsoft.com/zh-cn/library/ms752261.aspx
7. 配置 MS-AT,請參考
http://www.cnblogs.com/walkinhill/archive/2007/05/26/565020.html
第一次配置和使用 MSDTC 和 MS-AT 非常耗時(shí)間,幸運(yùn)的是最終還是成功了?,F(xiàn)在如果不提交 tr.complete(),更新是不會提交到的,數(shù)據(jù)庫數(shù)據(jù)不會更新。同時(shí)我用 “服務(wù)跟蹤查看器”跟蹤,發(fā)現(xiàn)除了第一個(gè)更新時(shí)間比較慢(約1秒),后續(xù)的更新和不使用 transaction 的時(shí)間相當(dāng)(約15毫秒),所以感覺使用 transaction 對性能沒什么影響。
我的環(huán)境:WCF 由 Win2003 IIS6 host,客戶端是 xp,vsts2008開發(fā)。
MSDTC要支持WS-AT協(xié)議要多做一番工作,但是如果是在本機(jī)上測試,會發(fā)現(xiàn),即使沒有配置MSDTC支持WS-AT協(xié)議,或者沒有啟用WS-AT協(xié)議,事務(wù)還是能夠正常的Commit和Rollback。剛開始不知道是什么原因。
后來查了一下微軟的相關(guān)文檔,發(fā)現(xiàn)使用wsHttpBinding支持事務(wù)時(shí),出于效率的考慮,WCF會首先使用Oletx事務(wù),而不是完全的ws-at協(xié)議。只有在oletx協(xié)議不可用的情況,比如135端口沒開、或者和java web service互操作的情況下,wcf才會完全使用ws-at協(xié)議。這固然是好,但是有時(shí)候我們并不希望這樣(比如測試的時(shí)候),這時(shí)候我們可以修改注冊表,禁止事務(wù)自動升級為oletx事務(wù)。具體是在注冊表:HKLM\SOFTWARE\Microsoft\WSAT\3.0下增加一個(gè)名為“OleTxUpgradeEnabled”的DWord值,并且設(shè)置值為0(1為啟用自動升級)
關(guān)于Oletx和WS-AT分別參考:
Oletx協(xié)議允許事務(wù)跨越程序與、進(jìn)程或機(jī)器邊界。使用RPC調(diào)用,采用Windows專用的二進(jìn)制格式,無法跨越防火墻,也不能和其他倚重平臺進(jìn)行整合。多用于Windwos體系的Internet環(huán)境。
WS-AT:和LoeTx相似,允許事務(wù)跨越程序與、進(jìn)程或機(jī)器邊界。但是他是一種工業(yè)標(biāo)準(zhǔn),采用HTTP協(xié)議,TEXT編碼,可跨越防火墻。
http://www.cnblogs.com/frank_xl/archive/2009/05/22/1487383.html
http://www.360doc.com/content/09/1225/01/495229_11916811.shtml
關(guān)于WS-AT的分析:
基于WS-AtomicTransaction標(biāo)準(zhǔn)的WCF遠(yuǎn)程分布式事務(wù)(二)
配置MSDTC WS-AT:
基于WS-AtomicTransaction標(biāo)準(zhǔn)的WCF遠(yuǎn)程分布式事務(wù)(一)