摘要:該文闡述了事務(wù)處理的重要性與.net事務(wù)處理的演變,以具體的實例講述了分布式事務(wù)在.net編程中的應(yīng)用。為處理分布式事務(wù)應(yīng)用設(shè)計提供了完善的解決方案和具體的操作步驟。
關(guān)鍵詞:事務(wù);分布式事務(wù)處理
中圖分類號:TP311 文獻標(biāo)識碼:A 文章編號:1009-3044(2012)28-6840-05
事務(wù)是執(zhí)行一連串工作的邏輯單元,事務(wù)中的所有工作項目完成,才算是一個完整的事務(wù),假設(shè)事務(wù)中有1000項工作,其中的999項完成,只有一項沒有完成都算事務(wù)失敗。事務(wù)中的各項工作組成了一個整體,事務(wù)完成后全部的數(shù)據(jù)必須保持穩(wěn)定的一致性狀態(tài),事務(wù)完成后數(shù)據(jù)必須正確無誤。事務(wù)處理最為典型的實例是銀行處理兩個賬戶間的轉(zhuǎn)賬業(yè)務(wù)。假設(shè)需要從A賬戶轉(zhuǎn)賬10000元到B賬戶。我們需要做的是將A賬戶減去10000元,同時需要在B賬戶加10000元。這兩步工作就需要在一個事務(wù)中完成。才能保證轉(zhuǎn)賬的成功或者失敗,以有效的避免只減不加與只加不減錯誤發(fā)生。事務(wù)處理最早是在數(shù)據(jù)庫系統(tǒng)中應(yīng)用的,在一個數(shù)據(jù)庫中數(shù)據(jù)庫系統(tǒng)提供了事務(wù)處理,為正確的進行數(shù)據(jù)業(yè)務(wù)處理提供了可能。然而隨著應(yīng)用需求的擴大。業(yè)務(wù)處理常常需要對存放在不同數(shù)據(jù)庫中的數(shù)據(jù)進行事務(wù)化處理,也就是需要進行分布式事務(wù)處理。為了適應(yīng)需求,微軟.NET開發(fā)工具在不斷的改進與提高事務(wù)處理技術(shù),以適應(yīng)新的需求。.net在2008版與2003版就有明顯的改進。在.NET 2008中事務(wù)處理更加簡單易用。
1 分布式事務(wù)處理
在應(yīng)用開發(fā)中常需要對存放在同一個物理服務(wù)器中不同數(shù)據(jù)庫的數(shù)據(jù)進行事務(wù)化處理,或者是需要對分布在不同地域的多臺數(shù)據(jù)庫中的數(shù)據(jù)進行事務(wù)化處理,以上兩種功能情況都需要進行分布式事務(wù)處理,其中的數(shù)據(jù)庫系統(tǒng)可能結(jié)構(gòu)不同,如一個應(yīng)用sql server庫,另一個應(yīng)用oracle 數(shù)據(jù)庫。假如我們需要在兩家銀行間進行轉(zhuǎn)賬業(yè)務(wù),兩家銀行應(yīng)用的數(shù)據(jù)庫服務(wù)器不同,進行轉(zhuǎn)賬業(yè)務(wù)就需要分布式事務(wù)處理,以保證兩個銀行賬戶間的收支平衡。不發(fā)生錯誤的業(yè)務(wù)處理。同樣應(yīng)用需求還很多,其共同的特點是需要在保證多臺服務(wù)間的數(shù)據(jù)能夠同時正確修改,或者不做修改。保護數(shù)據(jù)的完整性。分布式事務(wù)處理就是專門解決這類問題的技術(shù)系列。
1.1 ADO.NET事務(wù)處理的演變
傳統(tǒng)的.net事務(wù)處理分顯式事務(wù)與Enterprise Services 聲明式兩種。顯式事務(wù)具有速度快消耗資源少等特點,但是其功能簡單,只能管理單一對象和單一持久資源間的事務(wù),只能應(yīng)付單一SqlConnection對單一Sql Server間的事務(wù)(或oracle及其他數(shù)據(jù)庫),也就是說只能處理所有數(shù)據(jù)在一個物理數(shù)據(jù)庫中存放的應(yīng)用系統(tǒng)開發(fā),不能處理具有多個SqlConnection對多個Sql Server間的分布事務(wù)。Enterprise Services的聲明式事務(wù)通過COM+形式來提供事務(wù)服務(wù),并且需要調(diào)用分布式事務(wù)協(xié)調(diào)處理器MSTDC(Microsoft Distributed Trannsaction Coord)inator)來協(xié)調(diào)分布事務(wù),其事務(wù)功能強大,但是需要昂貴的成本代價,同時事務(wù)執(zhí)行速度慢。為了克服傳統(tǒng)事務(wù)處理在應(yīng)用中的局限,微軟在.NET 2008中推出了新的事務(wù)處理機制,當(dāng)然在類的命名空間上還是沿用了.NET 2003的System.Transactions,其構(gòu)成如圖2,系統(tǒng)提供了隱式事務(wù)處理程序編寫模型與顯式事務(wù)處理編程模型兩種實現(xiàn)方案。處理分布式事務(wù)還用到了MSDTC。
1.2 隱式事務(wù)處理編程模型
應(yīng)用時只需要定義TransactionScope,其中的各種語句將自動的被.NET編譯在一個事務(wù)中完成。同時在事務(wù)處理中不需要象傳統(tǒng)事務(wù)處理進行Commit與Rollback操作。TransactionScope對象可以自動確保事務(wù)執(zhí)行或回退。銀行轉(zhuǎn)賬業(yè)務(wù)實現(xiàn)如下
隱式事務(wù)處理具備了處理分布事務(wù)的能力,同時應(yīng)用較為簡單。不過在應(yīng)用需要注意的是在數(shù)據(jù)庫連接字符串中加入Enlist=true,保證數(shù)據(jù)庫連接添加到TransactionScope的作用范圍中,否則事務(wù)不能正常提交。
另一種顯式事務(wù)處理程序編寫模型CommittableTransaction對象,其編程模型如下:
顯式事務(wù)處理的特點是sqlconnection對象必須用EnlistTransaction方法加入到事務(wù)中,否則事務(wù)不能正常的發(fā)揮作用。在顯式事務(wù)處理中還需要進行事務(wù)提交與事務(wù)回退操作。無論是隱式事務(wù)還是顯式事務(wù)處理,系統(tǒng)都首先按Local Transaction來處理,當(dāng)Local Transaction無法應(yīng)付事務(wù)需求時系統(tǒng)自動的將事務(wù)處理升級為分不布式事務(wù)處理,并有MSDTC來負(fù)責(zé)事務(wù)的協(xié)調(diào)。
2 MSDTC的配置方法
.NET 2008 更新了事務(wù)處理機制,當(dāng)事務(wù)升級到分布式事務(wù)時,系統(tǒng)就用到MSDTC,MSDTC是微軟操作系統(tǒng)間保持事務(wù)同步的技術(shù),MSDTC的安裝配置步驟如下:
1)檢查操作系統(tǒng)是否安裝DTC組件。XP默認(rèn)安裝,Win2003默認(rèn)不安裝。安裝步驟如下:
a. “開始”|“控制面板”|“添加/刪除程序”|“添加/刪除Windows組件”,選擇“應(yīng)用程序服務(wù)器”,單擊“詳細(xì)信息”,選擇“啟用網(wǎng)絡(luò)DTC訪問”,單擊“確定”|“下一步”|“完成”。
b.“組件服務(wù)”|“計算機”|“我的電腦”,右鍵“屬性”|“MSDTC”。
勾選“使用本地協(xié)調(diào)器”,單擊“安全性配置”,彈出“安全配置”窗口,勾選“網(wǎng)絡(luò)DTC訪問”、“允許遠(yuǎn)程客戶端”、“允許遠(yuǎn)程管理”、“允許入站”、“允許出站”、“不要求進行驗證”、“啟用事務(wù)Inernet協(xié)議(TIP)事務(wù)”和“啟用XA事務(wù)”,“允許入站”和“允許出站”。 服務(wù)器端機器必須“允許入站”。 客戶端機器必須“允許出站”,DTC登陸賬號必須是“NT
3)配置防火墻以允許與 Msdtc.exe服務(wù)的網(wǎng)絡(luò)通訊,將防火墻安全等級設(shè)為中級即可。
4) 檢查兩臺機器能夠相互ping通Hostname。
Hostname是機器名,而不是IP。
若不可以,進行如下設(shè)置:
用文本編輯器修改系統(tǒng)的hosts文件,不同版本的windows的hosts文件的存放目錄不同,(windows2003存放在 C:\WINDOWS\system32\drivers\etc目錄下),在hosts中加入寫上IP和HostName,如 “192.168.1.116 lenovo07-884gb6.”,保存hosts。
參考文獻:
[1] [美]David Sceppa.ADO.NET 技術(shù)內(nèi)幕[M].粱超,張莉,賀堃,譯.北京:清華大學(xué)出版社,2003.
[2] Microsoft Visual Studio 2003 Online help.
[3] Microsoft Visual Studio 2008 Online help.
[4] [美] Matt Butler .ASP.NET 服務(wù)器控件高級編程[M].北京:清華大學(xué)出版社,200