(精)C#中TransactionScope的使用方法和原理

標簽:.net transactionscope
原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://cnn237111.blog.51cto.com/2359144/1271600

在.net 1.1的時代,還沒有TransactionScope類,因此很多關于事務的處理,都交給了SqlTransaction和 SqlConnection,每個Transaction是基于每個Connection的。這種設計對于跨越多個程序集或者多個方法的事務行為來說,不 是非常好,需要把事務和數據庫連接作為參數傳入。

在.net 2.0后,TransactionScope類的出現,大大的簡化了事務的設計。示例代碼如下:

1
2
3
4
5
6
7
8
9
10
11
static void Main(string[] args)
????????{
????????????using (TransactionScope ts = new TransactionScope())
????????????{
????????????????userBLL u = new userBLL();
????????????????TeacherBLL t = new TeacherBLL();
????????????????u.ADD();
????????????????t.ADD();
????????????????ts.Complete();
????????????}
????????}

只 需要把需要事務包裹的邏輯塊寫在using (TransactionScope ts = new TransactionScope())中就可以了。從這種寫法可以看出,TransactionScope實現了IDispose接口。除非顯示調用 ts.Complete()方法。否則,系統不會自動提交這個事務。如果在代碼運行退出這個block后,還未調用Complete(),那么事務自動回 滾了。在這個事務塊中,u.ADD()方法和t.ADD()方法內部都沒有用到任何事務類。

TransactionScope是基于當前線程的,在當前線程中,調用Transaction.Current方法可以看到當前事務的信息。具體關于TransactionScope的使用方法,已經它的成員方法和屬性,可以查看MSDN。

TransactionScope類是可以嵌套使用,如果要嵌套使用,需要在嵌套事務塊中指定TransactionScopeOption參數。默認的這個參數為Required。

該參數的具體含義可以參考http://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscopeoption(v=vs.80).aspx

比如下面代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void Main(string[] args)
????????{
????????????using (TransactionScope ts = new TransactionScope())
????????????{
????????????????Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
????????????????userBLL u = new userBLL();
????????????????TeacherBLL t = new TeacherBLL();
????????????????u.ADD();
????????????????using (TransactionScope ts2 = new TransactionScope(TransactionScopeOption.Required))
????????????????{
????????????????????Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
????????????????????t.ADD();
????????????????????ts2.Complete();
????????????????}
???????????????ts.Complete();
????????????}
????????}

當嵌套類的TransactionScope的TransactionScopeOption為Required的時候,則可以看到如下結果,他們的事務的ID都是同一個。并且,只有當2個TransactionScope都complete的時候才能算真正成功。

ED8FDA3E241D48B0A90F30A5AC8A9A59

如果把TransactionScopeOption設為RequiresNew,則嵌套的事務塊和外層的事務塊各自獨立,互不影響。

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void Main(string[] args)
????????{
????????????using (TransactionScope ts = new TransactionScope())
????????????{
????????????????Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
????????????????userBLL u = new userBLL();
????????????????TeacherBLL t = new TeacherBLL();
????????????????u.ADD();
????????????????using (TransactionScope ts2 = new TransactionScope(TransactionScopeOption.RequiresNew))
????????????????{
????????????????????Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
????????????????????t.ADD();
????????????????????ts2.Complete();
????????????????}
??????????????ts.Complete();
????????????}
????????}

22D29B0134CD4993B629F085EEBF63D9

可以看到,他們的事務id是不一樣的。

TransactionScopeOption設為Suppress則為取消當前區塊的事務,一般很少使用。

對于多個不同服務器之間的數據庫操作,TransactionScope依賴DTC(Distributed Transaction Coordinator)服務完成事務一致性。

但 是對于單一服務器數據,TransactionScope的機制則比較復雜。主要用的的是線程靜態特性。線程靜態特性 ThreadStaticAttribute讓CLR知道,它標記的靜態字段的存取是依賴當前線程,而獨立于其他線程的。既然存儲在線程靜態字段中的數據 只對存儲該數據的同一線程中所運行的代碼可見,那么,可使用此類字段將其他數據從一個方法傳遞到該第一個方法所調用的其他方法,而且完全不用擔心其他線程 會破壞它的工作。TransactionScope 會將當前的 Transaction 存儲到線程靜態字段中。當稍后實例化 SqlCommand 時(在此 TransactionScope 從線程局部存儲中刪除之前),該 SqlCommand 會檢查線程靜態字段以查找現有 Transaction,如果存在則列入該 Transaction 中。通過這種方式,TransactionScope 和 SqlCommand 能夠協同工作,從而開發人員不必將 Transaction 顯示傳遞給 SqlCommand 對象。實際上,TransactionScope 和 SqlCommand 所使用的機制非常復雜。具體可以參考文章http://www.microsoft.com/china/MSDN/library/netFramework/netframework/NETMattersSep.mspx?mfr=true

Wrox出版的《Professional C# 4 and .NET 4》也有關于TransactionScope的一些使用方法的介紹。

本文出自 “一只博客” 博客,請務必保留此出處http://cnn237111.blog.51cto.com/2359144/1271600

轉載于:https://www.cnblogs.com/Impulse/articles/5263689.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272224.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272224.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一文搞定并發面試題

1、Object 的 wait()和notify() 方法下圖為線程狀態的圖:Object 對象中的 wait()和notify()是用來實現實現等待 / 通知模式。其中等待狀態和阻塞狀態是不同的。等待狀態的線程可以通過notify() 方法喚醒并繼續執行,而阻塞狀態的線程則是等待獲取新的鎖。…

fork、vfork、wait、waitpid

fork函數: 一個進程,包括代碼、數據和分配給進程的資源。fork()函數通過系統調用創建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數或者傳入的變量不同,兩…

java解析xml

<?xml version"1.0" encoding"UTF-8"?> <mimetype><default><mime-type>text/html</mime-type></default><mime-mapping><extension>zip</extension><mime-type>application/zip</mime-…

Linux常見英文報錯中文翻譯(菜鳥必知)

Linux常見英文報錯中文翻譯(菜鳥必知)1.command not found 命令沒有找到2.No such file or directory 沒有這個文件或目錄3.Permission denied 權限不足4.No space left on device 磁盤沒有剩余空間5.File exists 文件已經存在6.Is a directory 這是1個目錄7.Not a directory 不…

阿里開源分布式事務seata帶你入門

介紹 Seata 是阿里巴巴開源的分布式事務中間件&#xff0c;一種分布式事務解決方案&#xff0c;具有高性能和易于使用的微服務架構。 1:對業務無侵入&#xff1a;即減少技術架構上的微服務化所帶來的分布式事務問題對業務的侵入 2:高性能&#xff1a;減少分布式事務解決方案…

exec族函數、system函數、popen函數、PATH

exec族函數函數的作用&#xff1a; 我們用fork函數創建新進程后&#xff0c;經常會在新進程中調用exec函數去執行另外一個程序。當進程調用exec函數時&#xff0c;該進程被完全替換為新程序&#xff08;在exec都后面的代碼不會被得到執行&#xff09;。因為調用exec函數并不創建…

jquery.validate.unobtrusive的使用

應用 一、引入 <script src"Scripts/jquery-1.7.1.min.js"></script> <script src"Scripts/jquery.validate.js"></script> <script src"Scripts/jquery.validate.unobtrusive.js"></script> 二、1&#xf…

Linux操作系統六大優點

??作者主頁&#xff1a;IT技術分享社區 ??作者簡介&#xff1a;大家好,我是IT技術分享社區的博主&#xff0c;從事C#、Java開發九年&#xff0c;對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽&#xff1a; 數據庫領域優質創作者&#x1f3c6;&#x…

[webview] 放大縮小的問題

http://www.cocoachina.com/bbs/read.php?tid33249轉載于:https://www.cnblogs.com/zxykit/p/5274831.html

進程間通信IPC(一)(半雙工管道和消息隊列)

引言&#xff1a; 之前學習的進程之間交換信息的方法只能由fork或exec傳送打開文件&#xff0c;或者文件系統。但是這種通訊方式有局限性&#xff0c;接下來將說明進程之間相互通信的其他技術——IPC(InterProcessCommunication)&#xff0c;過去UNIX系統IPC是各種進程間通信方…

Seata相關概念

相關概念 XID&#xff1a;一個全局事務的唯一標識 Transaction Coordinator (TC)&#xff1a; 事務協調器&#xff0c;維護全局事務的運行狀態&#xff0c;負責協調并驅動全局事務的提交或回滾&#xff08;可以理解為事務的協調者&#xff09;。 Transaction Manager (TM)&…

VSS配置

http://www.cnblogs.com/FreeDong/articles/2193151.html轉載于:https://www.cnblogs.com/lacey/p/5275514.html

Program terminated with signal SIGSEGV, Segmentation fault.

問題&#xff1a; 在程序運行時出現了&#xff1a;Segmentation fault (core dumped)&#xff0c;分段故障(堆芯轉儲)也就是段錯誤。 我首先在一篇博客上面找到如何使用gdb調試&#xff1a; 1、首先使用ulimit -a查看你的core file size是否為0.如果不是的話就請跳到步驟3&am…

NFS簡介

NFS 是Network File System的縮寫&#xff0c;即網絡文件系統。一種使用于分散式文件系統的協定&#xff0c;由Sun公司開發&#xff0c;于1984年向外公布。功能是通過網絡讓不同的機器、不同的操作系統能夠彼此分享個別的數據&#xff0c;讓應用程序在客戶端通過網絡訪問位于服…

Php Laravel框架 多表關系處理 之 Eloquent一對多關系處理

Php Laravel框架 多表關系處理 之 Eloquent一對多關系處理 本博文主要介紹 Laravel 框架中 Eloquent 對一對多關系的處理以及在 Laravel Administrator(后臺擴展包)中的應用。 您的數據庫可能是彼此相關的。比方&#xff0c;一篇博客文章可能有很多評論&#xff0c;或者一個訂…

進程間通信IPC(二)(共享內存、信號、信號量)

共享內存&#xff1a; 共享內存就是允許兩個或多個進程共享一定的存儲區。就如同 malloc() 函數向不同進程返回了指向同一個物理內存區域的指針。當一個進程改變了這塊地址中的內容的時候&#xff0c;其它進程都會察覺到這個更改。因為數據不需要在客戶機和服務器端之間復制&am…

分布式理論CAP定理

CAP原則又稱CAP定理&#xff0c;指的是在一個分布式系統中&#xff0c; Consistency&#xff08;一致性&#xff09;、 Availability&#xff08;可用性&#xff09;、Partition tolerance&#xff08;分區容錯性&#xff09;&#xff0c;三者不可兼得。 998年&#xff0c;加州…