發(fā)文章
發(fā)文工具
撰寫
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊(cè)
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
一:從事務(wù)的歷史說起
知已知彼,百戰(zhàn)不敗。想了解事務(wù),我們從事務(wù)的歷史說起。
在Windows平臺(tái)上,事務(wù)的概念最開始出現(xiàn)在關(guān)系型數(shù)據(jù)庫中,但是隨著.net平臺(tái)的發(fā)展,事務(wù)包括的的范圍也越來越寬,先一睹為快,
在關(guān)系型數(shù)據(jù)庫中的事務(wù)是通過begin transaction,rollback transaction, commit 等關(guān)鍵字來實(shí)現(xiàn)事務(wù)的。
BEGIN TRANSACTION UPDATE [dbo].[T_ACCOUNT] SET BALANCE = BALANCE + @amount WHERE ID = @toAccount IF @@ERROR <> 0 BEGIN ROLLBACK TRANSACTION END ELSE COMMIT TRANSACTION
隨著面象對(duì)象的發(fā)展,.net的誕生,在.net 1.* 的版本中,可以通過ADO.NET來實(shí)現(xiàn)數(shù)據(jù)庫的事務(wù)。把事務(wù)交給業(yè)務(wù)程序來控制,使業(yè)務(wù)程序的本職發(fā)揮的淋漓盡致,而從數(shù)據(jù)庫的角度來看,數(shù)據(jù)庫也能更專一的進(jìn)行數(shù)據(jù)的存儲(chǔ)。達(dá)到了各盡其責(zé)的效果。
using (DbTransaction transaction = connection.BeginTransaction()) { command.Transaction = transaction; try { command.ExecuteNonQuery(); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); throw new Exception(ex.Message); } }
萬物是發(fā)展的,程序的發(fā)展也是永遠(yuǎn)止境的。某天有一個(gè)需求:創(chuàng)建一個(gè)客戶信息,其中包括姓名和頭像。姓名保存在數(shù)據(jù)庫,頭像保存在服務(wù)器的硬盤中。姓名和頭像的保存有一個(gè)失敗都是一個(gè)不完整的操作,都要回滾到初始狀態(tài)。用ADO.NET的事務(wù)顯示不能實(shí)現(xiàn)這個(gè)要求。因?yàn)榛刭Y源包括了數(shù)據(jù)庫和硬盤?;谶@種情況,.net 2.0推出了System.Transactions事務(wù)。
using (TransactionScope transactionScope = new TransactionScope()) { bankService.Pay("111", 50); bankService.Receipt("222", 50); transactionScope.Complete(); }
System.Transactions名稱空間下的事務(wù),是.net的主推事務(wù)。
二:事務(wù)有關(guān)概念
第一節(jié),我們都用代碼把事務(wù)實(shí)踐了一把,那還有必要來說事務(wù)的概念和事務(wù)在運(yùn)行過程中涉及到的對(duì)象呢?如果你想深入了解事務(wù),這一步是必須的。
事務(wù)的定義和屬性:
1,什么是事務(wù):它是一個(gè)操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個(gè)不可分割的工作單位。
2,事務(wù)特性:接觸事務(wù),都是從事務(wù)的ACID開始,原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。每個(gè)特性的定義僵硬,枯燥,不易理解,讀了好幾篇都有讓人想跳樓的欲望。今兒換一個(gè)方式來說事務(wù)特性。
銀行轉(zhuǎn)款是事務(wù)的經(jīng)典示例,可能因?yàn)殄X與銀行扯的上關(guān)系,一提到銀行,大家都精神倍爽,為了不另類,所以我也決定用銀行轉(zhuǎn)款來說事務(wù)的四大特性。
2.2:一致性:給朋友轉(zhuǎn)款888元RMB作為婚禮的禮金,但是朋友只收到777元RMB。這時(shí)你不爽了,你朋友也不爽,所以轉(zhuǎn)款要必須保證數(shù)據(jù)的一致性。
2.4:持久性:轉(zhuǎn)款這個(gè)操作被銀行記錄起來,過很多年后,你都還能查詢到轉(zhuǎn)款這個(gè)記錄。這就是持久性。
事務(wù)涉及的對(duì)象:
1,資源:應(yīng)用程序存儲(chǔ)和獲取數(shù)據(jù)的地方,可以是數(shù)據(jù)庫,文件,也可以是內(nèi)存。如果是應(yīng)用程序的事務(wù)塊代碼中涉及到的數(shù)據(jù)庫,文件,內(nèi)存,那這些資源就稱為事務(wù)型資源。
2,資源管理器:在事務(wù)模型中,應(yīng)用不是直接訪問資源,而是通過中間介訪問資源,這個(gè)中間介就叫資源管理器。資源分為可持久化資源(對(duì)應(yīng)了持久化資源管理),易失資源(對(duì)應(yīng)了易失資源管理器)。
3,事務(wù)管理器:實(shí)現(xiàn)事務(wù)的開始,提交,回滾。
事務(wù)提升:
要認(rèn)識(shí)事務(wù)提升,必須要弄清楚事務(wù)管理器的類型。如下作了非常詳細(xì)的介紹:
1:輕量級(jí)事務(wù)管理器:作用于開啟事務(wù)的應(yīng)用程序域,只能包含一個(gè)持久化資源,如果再添加一個(gè)持久化資源,將被輕量級(jí)事務(wù)管理器忽略。但是可以登記多個(gè)易失資源。目前輕量級(jí)事務(wù)管理器只支持SQL 2005以及SQL2005以上的版本持久化資源。
3:內(nèi)核事務(wù)管理器:在Vista被引入,并后續(xù)于Windows Server 2008,WIN7。引入內(nèi)核事務(wù)管理器主要是把文件管理(NTFS文件系統(tǒng))和注冊(cè)表管理納入事務(wù)范疇。我們將那些支持事務(wù)的文件系統(tǒng)和注冊(cè)表叫作事務(wù)型文件系統(tǒng)(TxF)和事務(wù)型注冊(cè)表(TxR)。 之所以稱為內(nèi)核事務(wù)管理器,是因它運(yùn)行在內(nèi)核模式上,而不是在用戶模式上。同樣內(nèi)核事務(wù)管理器只支持一個(gè)持久化資源。
3:分布式事務(wù)協(xié)調(diào)器:每一臺(tái)電腦上只有一個(gè)分布式事務(wù)協(xié)調(diào)器,它管理了當(dāng)前計(jì)算機(jī)的所有事務(wù)資源。它可以跨程序域,跨進(jìn)程,跨機(jī)器,跨網(wǎng)絡(luò)來執(zhí)行事務(wù)。當(dāng)事務(wù)跨機(jī)器時(shí),每臺(tái)機(jī)器的分布式事務(wù)協(xié)調(diào)器按照相應(yīng)的協(xié)議工作,實(shí)現(xiàn)對(duì)整個(gè)事務(wù)的管理,它對(duì)應(yīng)的事務(wù)管理協(xié)議有Ole-Tx和WS-Atomic Transaction(WS-AT)這些。 分布式事務(wù)協(xié)調(diào)器能夠管理一個(gè)分布式事務(wù)涉及的所有事務(wù)型資源,不管具體的事務(wù)型資源分布在何處。
事務(wù)提升:事務(wù)是一個(gè)動(dòng)態(tài)執(zhí)行的操作序列,在整個(gè)過程中,不可能預(yù)知資源的登記情況。所以輕量級(jí)事務(wù)管理器作為默認(rèn)的事務(wù)管理器,隨著事務(wù)的逐步執(zhí)行,如果涉及到內(nèi)核事務(wù)資源,那么將提升為內(nèi)核事務(wù)管理器。如果出現(xiàn)對(duì)多個(gè)事務(wù)資源的訪問,或者當(dāng)前事務(wù)涉及跨域(調(diào)用另外一個(gè)服務(wù)),就會(huì)提升為分布式事務(wù)協(xié)調(diào)器。Windows采用事務(wù)提升機(jī)制進(jìn)行事務(wù)管理器的選擇。
三:事務(wù)的分類
1:本地事務(wù)
輕量級(jí)事務(wù)管理器,內(nèi)核事務(wù)管理器都只支持本地事務(wù)。本地事務(wù)相對(duì)簡單,這兒不作重點(diǎn)簡述。
2:分布式事務(wù)
理解分布式事務(wù)是怎樣實(shí)現(xiàn)的,事務(wù)提交樹是關(guān)鍵。
事務(wù)提交樹:事務(wù)提交樹的根是事務(wù)初始化服務(wù)所在的機(jī)器的DTC,它在整個(gè)事務(wù)提交過程中充當(dāng)著總協(xié)調(diào)者,又被稱為全局提交協(xié)調(diào)器。資源管理器充當(dāng)著事務(wù)提交樹的葉子節(jié)點(diǎn),它們的父結(jié)點(diǎn)為本機(jī)的DTC,分布于不同機(jī)器的DTC按照事務(wù)的傳播路徑形成了上下級(jí)關(guān)系。
在一個(gè)分布式事務(wù)中,事務(wù)的初始化和提交是屬于一個(gè)對(duì)象,只有最初開始的事務(wù)才能被提交,我們將這種能被初始化和提交的事務(wù)稱作可提交事務(wù)。隨著參與者逐個(gè)登記到事務(wù)中,它們本地的事務(wù)實(shí)際上依賴著這個(gè)最初開始的事務(wù),所以我們稱這種事務(wù)叫依賴事務(wù)。
四:示例
文件事務(wù)
在MSDN上對(duì)文件事務(wù)有詳細(xì)的闡述 使用文件系統(tǒng)事務(wù)增強(qiáng)您的應(yīng)用程序 我們?nèi)绻亲屑?xì)閱讀這篇文章不難發(fā)現(xiàn)他提供了一個(gè).exe類型文件的下載。先把這個(gè)TxF2007_07.exe文件下載到本地硬盤,執(zhí)行它,可以得到一個(gè)關(guān)于 c#的 KtmIntegration.csproj 的項(xiàng)目,我們用visual studio來打開這個(gè)項(xiàng)目,并且重新重成這個(gè)項(xiàng)目,可以得到一個(gè)KtmIntegration.dll文件。在你要實(shí)現(xiàn)的文件事務(wù)的項(xiàng)目中引入這個(gè).dll文件,那你就可以很順利的實(shí)現(xiàn)文件事務(wù)的操作了。具體代碼:
using System; using System.IO; using System.Transactions; using Microsoft.KtmIntegration; namespace Exercise.WebLocalTransaction { public partial class Test02 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { using (TransactionScope transactionScope = new TransactionScope()) { try { FileStream stream = TransactedFile.Open( @"D:/Sam Xiao.txt" , FileMode.OpenOrCreate , FileAccess.ReadWrite , FileShare.ReadWrite); StreamWriter writer = new StreamWriter(stream); writer.WriteLine(String.Concat("執(zhí)行一個(gè)事務(wù)代碼:",DateTime.Now.ToString(),Environment.NewLine)); writer.Close(); //int x = 0; //int y = 10; //int z = y / x; transactionScope.Complete(); } catch { } } } } }
不要忘記了引入using Microsoft.KtmIntegration;名稱空間。在段代碼沒有異常的情況下,我們可以看到D盤里順利創(chuàng)建了一個(gè)關(guān)于Sam Xiao.txt的文件。我們故意在這段代碼中拋出一個(gè)被0整除的異常,那么整個(gè)操作就會(huì)回滾。
分布式事務(wù)
在.net平臺(tái)上,主要是通過WCF的手段來實(shí)現(xiàn)程序的分布式開發(fā)。在WCF事務(wù)體系:主要解決了事務(wù)在服務(wù)中的流轉(zhuǎn),以及解決服務(wù)內(nèi)部直接或間接訪問事務(wù)型資源的協(xié)作。
用WCF來演示事務(wù)的時(shí)候,要選擇好WCF的綁定類型,有一部份綁定是不支持WCF的事務(wù)傳播的。我們選擇wsHttpBinding 來做WCF的事務(wù)演示。
1,首先定義好WCF的服務(wù)契約
[ServiceContract(Name = "IBankingService")] public interface IBankingService { [TransactionFlow(TransactionFlowOption.Mandatory)] [OperationContract(Name = "Transfer")] void Transfer(string fromAccountId, string toAccountId, double amount); [TransactionFlow(TransactionFlowOption.Mandatory)] [OperationContract(Name = "Pay")] bool Pay(String accountID, double amount); [TransactionFlow(TransactionFlowOption.Mandatory)] [OperationContract(Name = "Receipt")] bool Receipt(String accountID, double amount); }
2,實(shí)現(xiàn)WCF的服務(wù)
[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)] public class BankingService : IBankingService { [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public void Transfer(string fromAccountId, string toAccountId, double amount) { throw new NotImplementedException(); } [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public bool Pay(string accountID, double amount) { throw new NotImplementedException(); } [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public bool Receipt(string accountID, double amount) { throw new NotImplementedException(); } }
3,WCF宿主配置
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="sBehaviorConfig"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <wsHttpBinding> <binding name="wshttpConfig" transactionFlow="true" > <security mode="None" /> </binding> </wsHttpBinding> </bindings> <services> <service name="Exercise.Service.BankingService" behaviorConfiguration="sBehaviorConfig"> <endpoint address="mex" binding="wsHttpBinding" bindingConfiguration="wshttpConfig" contract="Exercise.Contract.IBankingService"></endpoint> </service> </services> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel>
4,WCF客戶端配置
<system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_IBankingService" transactionFlow="true"> <security mode="None" /> </binding> </wsHttpBinding> </bindings> <client> <endpoint address="http://localhost:9100/BankingService.svc/mex" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IBankingService" contract="Exercise.Contract.IBankingService" name="WSHttpBinding_IBankingService" /> </client> </system.serviceModel>
5,調(diào)用服務(wù)
IBankingService bankService = WcfProxy.CreateProxy<IBankingService>("WSHttpBinding_IBankingService"); protected void Page_Load(object sender, EventArgs e) { using (TransactionScope transactionScope = new TransactionScope()) { bankService.Pay("111", 50); bankService.Receipt("222", 50); transactionScope.Complete(); } }
此時(shí)我們WCF演示事務(wù)的五步曲就完成了。我們做敏捷開發(fā)都知道,可運(yùn)行的代碼高于詳細(xì)的文檔。如果還有不太明白的地方,可以在網(wǎng)上搜索,也可以留言問我。
五:總結(jié)
【推薦】,你們的推薦是我的動(dòng)力。
滴水之恩,當(dāng)涌泉相報(bào)。回報(bào)幫助過我的人,以及需要我?guī)椭娜?span style="COLOR: rgb(255,0,0); FONT-SIZE: 18pt">【源碼下載】 。
來自: 昵稱10504424 > 《工作》
0條評(píng)論
發(fā)表
請(qǐng)遵守用戶 評(píng)論公約
Metaq原理
commit() 提交事務(wù)rollback() 回滾事務(wù)setRollbackOnly() 標(biāo)識(shí)關(guān)聯(lián)到當(dāng)前線程的分布式事務(wù)將被回滾getStatus() 返回關(guān)聯(lián)到當(dāng)前...
C#
前面三節(jié)是事務(wù)的基礎(chǔ),主要介紹事務(wù)的由來以及事務(wù)管理器的總體結(jié)構(gòu),分別講述輕量級(jí)事務(wù)管理器(LTM)、核心事務(wù)管理器(KTM)、分布式事務(wù)協(xié)調(diào)器(DTC)的差別。事務(wù)以相互隔離的方式執(zhí)行,事務(wù)以外...
JTA
JTA 簡介Java 事務(wù) API(JTA) 及其同門兄弟 Java 事務(wù)服務(wù)(Java Transaction Service JTS)為 J2EE 平臺(tái)提供了分布式事務(wù)服務(wù)。JTA 事務(wù)比 JDBC 事務(wù)功能更強(qiáng)。JDBC 事務(wù)局限為一個(gè)數(shù)據(jù)庫連接,而 JTA 事...
OpenAFS 幫助聚集分布式數(shù)據(jù)
雖然 Linux 文件系統(tǒng)從 Journal File System (JFS) 開始就包含了日志文件系統(tǒng),但是下一代文件系統(tǒng) (XFS) 和早期的 ReiserFS 也被改造成對(duì)其可用,還有一個(gè)不管是技術(shù)媒體還是公司宣傳都沒有過多提及的...
分布式事務(wù)( 圖解 + 秒懂 + 史上最全 )
全局事務(wù):當(dāng)事務(wù)由全局事務(wù)管理器進(jìn)行全局管理時(shí)成為全局事務(wù),事務(wù)管理器負(fù)責(zé)管理全局的事務(wù)狀態(tài)和參與的資源,協(xié)同資源的一致提交回...
mysql 事物概述
當(dāng)多個(gè)事務(wù)同時(shí)更新數(shù)據(jù)庫中相同的數(shù)據(jù)時(shí),只允許持有鎖的事務(wù)能更新該數(shù)據(jù),其他事務(wù)必須等待,直到前一個(gè)事務(wù)釋放了鎖,其他事務(wù)才有機(jī)會(huì)更新該數(shù)據(jù)。帶有保存點(diǎn)的扁平事務(wù),除了扁平事務(wù)支持的操作...
事務(wù)處理
事務(wù)管理器在分布式事務(wù)中,每個(gè)參與資源均有一個(gè)本地事務(wù)管理器 (TM) 來跟蹤此計(jì)算機(jī)上傳入的和傳出的事務(wù)。手動(dòng)事務(wù)允許顯式開始事務(wù)、控制事務(wù)邊界內(nèi)的每個(gè)連接和資源登記、確定事務(wù)結(jié)果(提交或中...
.NET簡談事務(wù)、分布式事務(wù)處理
今天這篇文章我們將使用.NET C#來進(jìn)行事務(wù)性編程,從淺顯、簡單的本地事務(wù)開始,也就是我們用的最多的ADO.NET事務(wù)處理,然后我們逐漸擴(kuò)...
JTA 深度歷險(xiǎn)
事務(wù)管理器( TransactionManager )將應(yīng)用對(duì)分布式事務(wù)的使用映射到實(shí)際的事務(wù)資源并在事務(wù)資源間進(jìn)行協(xié)調(diào)與控制。begin()- 開始事務(wù) c...
微信掃碼,在手機(jī)上查看選中內(nèi)容