1. 程式人生 > >TransactionScope 分散式事務的使用案例 以及簡單說明

TransactionScope 分散式事務的使用案例 以及簡單說明

http://www.cnblogs.com/zhbsh/archive/2011/05/14/2046042.html

 TransactionScope 是的.net Framework2.0版本中增加的一個新名稱空間。他的用途是為資料庫訪問提供一個“輕量級”的事物。使用之前必須新增對 System.Transactions.dll 的引用。先介紹介紹幾個簡單的引數。

TransactionScopeOptions 描述
Required 如果已經存在一個事務,那麼這個事務範圍將加入已有的事務。否則,它將建立自己的事務。
RequiresNew 這個事務範圍將建立自己的事務。
Suppress 如果處於當前活動事務範圍內,那麼這個事務範圍既不會加入氛圍事務 (ambient transaction),也不會建立自己的事務。當部分程式碼需要留在事務外部時,可以使用該選項。

您可以在程式碼的任何位置上隨是檢視是否存在事務範圍,具體方法就是檢視 System.Transactions.Transaction.Current 屬性。如果這個屬性為“null”,說明不存在當前事務。
       若要更改 TransactionScope 類的預設設定,您可以建立一個 TransactionOptions 物件,然後通過它在 TransactionScope 物件上設定隔離級別和事務的超時時間。TransactionOptions 類有一個 IsolationLevel 屬性,通過這個屬性可以更改隔離級別,例如從預設的可序列化 (Serializable) 改為ReadCommitted,甚至可以改為 SQL Server 2005 引入的新的快照 (Snapshot) 級別。(請記住,隔離級別僅僅是一個建議。大多數資料庫引擎會試著使用建議的隔離級別,但也可能選擇其他級別。)此外,TransactionOptions 類還有一個 TimeOut 屬性,這個屬性可以用來更改超時時間(預設設定為 1 分鐘)。
TransactionOptions opt

=new TransactionOptions();
//設定TransactionOptions

opt.IsolationLevel = IsolationLevel.ReadCommitted;
// 設定超時間隔為2分鐘,預設為60秒opt.Timeout =new TimeSpan(020);

使用時候將

using (TransactionScope sCope =new TransactionScope(TransactionScopeOption.RequiresNew, opt))

其他和預設一樣

下面做一個簡單的demo 只需要新增很少的幾行程式碼,這個模型可以對異常進行處理,執行結束後會自行清理,此外,它還可以對命令的提交或回滾進行管理

1.TransactionScope  在一個事務範圍內

在app.config中

<connectionStrings>
    <add name="myCon" connectionString="Data Source=.;uid=sa;pwd=sa;database=B2C3;Asynchronous Processing=true"/>
    <add name="myCon2" connectionString="Data Source=.;uid=sa;pwd=sa;database=b2c;Asynchronous Processing=true"/>
    <add name="myCon3" connectionString="Data Source=.;uid=sa;pwd=sa;database=demo;Asynchronous Processing=true"/>
    <add name="myCon4" connectionString="Data Source=.;uid=sa;pwd=sa;database=News;Asynchronous Processing=true"/>


  </connectionStrings>

 static void Main(string[] args)
        {
           string constr = ConfigurationManager.ConnectionStrings["myCon"].ConnectionString;
            string constr2 = ConfigurationManager.ConnectionStrings["myCon2"].ConnectionString;
            string sql = "insert into [Tuser](username,pwd,age) values('新聞socpe測試','bbb',10)";
            #region 不同庫的事務
            using (TransactionScope sope = new TransactionScope())
            {

                 using(SqlConnection con =new SqlConnection(constr))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, con))
                    {
                        con.Open();
                      int a=  cmd.ExecuteNonQuery();
                      Console.WriteLine(a);
                    
                    }
                   
                
                }
                using (SqlConnection con = new SqlConnection(constr2))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, con))
                    {
                        con.Open();
                        int b = cmd.ExecuteNonQuery();
                        Console.WriteLine(b);

                    }


                }

                addOtherUser();
                sope.Complete();

            }
            #endregion

    sope.Complete(); 是個標示。只有全部執行才提交事務

2.巢狀 呼叫事務

        static void Main(string[] args)
        {


            string constr = ConfigurationManager.ConnectionStrings["myCon"].ConnectionString;
            string constr2 = ConfigurationManager.ConnectionStrings["myCon2"].ConnectionString;
            string sql = "insert into [Tuser](username,pwd,age) values('新聞socpe測試','bbb',10)";
            #region 不同庫的事務
            using (TransactionScope sope = new TransactionScope(TransactionScopeOption.Required))
            {

             
                using(SqlConnection con =new SqlConnection(constr))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, con))
                    {
                        con.Open();
                      int a=  cmd.ExecuteNonQuery();
                      Console.WriteLine(a);
                    
                    }
                   
                
                }
                using (SqlConnection con = new SqlConnection(constr2))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, con))
                    {
                        con.Open();
                        int b = cmd.ExecuteNonQuery();
                        Console.WriteLine(b);

                    }


                }

                addOtherUser();
                sope.Complete();

            }
            #endregion


        }

        private static void addOtherUser()
        {
            string constr3 = ConfigurationManager.ConnectionStrings["myCon3"].ConnectionString;
            string constr4 = ConfigurationManager.ConnectionStrings["myCon4"].ConnectionString;
            string sql1 = "insert into [hr_user](username,password) values('新聞socpe測試','bbb')";
            string sql2 = "insert into [Users](username,userpwd) values('新聞socpe測試','bbb')";

            //RequiresNew 這個事務範圍將建立自己的事務。 
            using(TransactionScope sope=new TransactionScope(TransactionScopeOption.RequiresNew))
            {

                using (SqlConnection con = new SqlConnection(constr3))
                {
                    using (SqlCommand cmd = new SqlCommand(sql1, con))
                    {
                        con.Open();
                        int a = cmd.ExecuteNonQuery();
                        Console.WriteLine(a);

                    }


                }
                using (SqlConnection con = new SqlConnection(constr4))
                {
                    using (SqlCommand cmd = new SqlCommand(sql2, con))
                    {
                        con.Open();
                        int b = cmd.ExecuteNonQuery();
                        Console.WriteLine(b);

                    }


                }
                sope.Complete();
            }
        
        }

 總結:

現在知道了TransactionScope中的資料庫操作實際是參與了其中的環境事務,將它理解為是自動建立的SqlTransaction,而巢狀在其中的TransactionScope中的資料庫操作會新增到這個環境事務中(以TransactionScopeOption.Required為引數生成的TransactionScope)。

  也知道了Complete方法並不是執行後,就會提交事務,而只是表明之前的動作都符合要求,只是一種確認,不執行該方法,事務便不能完成。而只有最外層TransactionScope執行了Complete方法後,在離開using塊時,事務才真正的提交。所以說TransactionScope是能巢狀的。

  Transaction類有一靜態屬性Current,在一個TransactionScope中的Complete方法執行之前可以訪問,它返回的便是環境事務。

但是:   進入和退出事務都要快,這一點非常重要,因為事務會鎖定寶貴的資源。最佳實踐要求我們在需要使用事務之前再去建立它,在需要對其執行命令前迅速開啟連線,執行動作查詢 (Action Query),並儘可能快地完成和釋放事務。在事務執行期間,您還應該避免執行任何不必要的、與資料庫無關的程式碼,這能夠防止資源被毫無疑義地鎖定過長的時間


相關推薦

TransactionScope 分散式事務的使用案例 以及簡單說明

http://www.cnblogs.com/zhbsh/archive/2011/05/14/2046042.html  TransactionScope 是的.net Framework2.0版本中增加的一個新名稱空間。他的用途是為資料庫訪問提供一個“輕量級”的事物

ActiveMQ解決分散式事務方案以及程式碼實現(一)

1.場景描述 可以設想一個比較常見的分散式事務場景,商品上架操作,該操作涉及到商品模組的Service服務中的上架操作,同時必須要滿足在solr中建立商品的索引方便前臺搜尋以及生成商品的靜態化頁面,在上架操作中傳送了一條訊息,訊息接收方搜尋工程以及靜態化工程分

TransactionScope分散式事務,將兩個資料庫操作放在一個事務

一、概念 1、在專案中引用using System.Transactions名稱空間(先要在新增net元件的引用); TransactionScope有三種模式: TransactionScopeOptions 描述 Required 如果已經存在一個事務,那麼這個事務範

TransactionScope分散式事務

  TransactionScope是.Net Framework 2.0滯後,新增了一個名稱空間。它的用途是為資料庫訪問提供了一個“輕量級”[區別於:SqlTransaction]的事物。使用之前必須新增對 System.Transactions.dll 的引用。    

分散式事務之——tcc-transaction分散式TCC型事務框架搭建與實戰案例【轉】

一、背景 有一定分散式開發經驗的朋友都知道,產品/專案/系統最初為了能夠快速迭代上線,往往不太注重產品/專案/系統的高可靠性、高效能與高擴充套件性,採用單體應用和單例項資料庫的架構方式快速迭代開發;當產品/專案/系統做到一定規模的時候,原有的系統架構則不足以支撐義務發展需要,往往相同的業務則需要

分散式事務以及

標題格   1、非公平鎖   2、TCC分散式事務 1、非公平鎖  在加鎖過程,執行緒1執行,執行緒2處於等待佇列。 執行緒1執行結束,結果執行緒3搶先於執行緒2進行。這就是非公平鎖的簡單含義。  在ReentrantLock lock = new ReentrantLock()預設的就是非公平鎖,建構

springcloud 中使用redis以及rabbitMQ實現分散式事務

分散式事務的補償機制,在很多成熟的案例都是使用TCC機制,來實現資源凍結,以及提交,失敗則釋放資源,很多情況下,處理業務的特殊情況需要對不支援事務的redis進行手動的事務補償。 比如,現在人臉識別入庫的服務,演算法識別人臉的服務,這兩個是依賴性比較高的服務,而且存在長事務,如果需要查詢頻繁

BMP影象資料格式詳解以及簡單案例

一.簡介 BMP(Bitmap-File)圖形檔案是Windows採用的圖形檔案格式,在Windows環境下執行的所有圖象處理軟體都支援BMP圖象檔案格式。Windows系統內部各影象繪製操作都是以BMP為基礎的。Windows 3.0以前的BMP圖檔案格式與顯示裝置有關,因此把這種BMP圖象檔

[轉載]TransactionScope分散式事務

原文連結:http://www.cnblogs.com/cn_wpf/archive/2007/08/06/844766.html 分散式事務聽起來很不錯,其實不然。它只是儘可能的降低資料不一致的可能性,並不能完全避免。從我的應用中來看,總數約5千萬的操作,錯了十幾個。當然,這個錯誤率完全可以忍

將不確定變為確定~transactionscope何時提升為分散式事務~SQL2005與SQL2008不同

回到目錄 Transactionscope何時被提升為分散式事務,即時要觸發msdtc服務,這個問題與資料庫版本有關,在前面的文章中,我的MSTDC系列出現了多個版本,有一點沒有說清楚,測試的環境不同,所以產生了多個版本,下面我做一下總結: 一 資料庫與WWW伺服器不在一臺電腦,資料庫為SQL20

將不確定變為確定~transactionscope何時提升為分散式事務?(sql2005資料庫解決提升到MSDTC的辦法)

回到目錄 對於transactionscope不瞭解的同學,可以看我的相關文章 宣告: 對於這種事務,如果希望程式出錯自動回滾,必須將異常throw出來,不能愉愉的用日誌記錄! 測試: 對於sql2008已經很好的支援了transactionscope,而對於sql2005來說,支援的不是很好,

第一次有人把“分散式事務”講的這麼簡單明瞭

又或者在網上購物明明已經扣款,但是卻告訴我沒有發生交易。這一系列情況都是因為沒有事務導致的。這說明了事務在生活中的一些重要性。 有了事務,你去小賣鋪買東西,那就是一手交錢一手交貨。有了事務,你去網上購物,扣款即產生訂單交易。 事務的具體定義 事務提供一種機制將一個活動涉

MyBatis的環境搭建以及簡單案例

MyBatis的環境搭建以及簡單案例 MyBatis框架簡介 資料持久化(概念) ORM(資料持久化技術) MyBatis環境搭建 MyBatis框架簡介 MyBatis的前身是iBatis,是一個開源的資料

基於訊息的分散式事務簡單方案

System-A為主系統 流程描述 1. system-A執行本地事務, 傳送msg到redis,此時msg狀態為unknown(這裡全是unknown狀態的msg,訊息需要持久化,只有msg存在,即使system-b處理失敗也可以有其他方式處理,一般是人工) 2.1

【黑馬程式設計師】分散式事務TransactionScope(學習筆記)

分散式事務: btnDel_Click() {  Delete(1);  Delete(2); } 如果 Delete(1)執行後Delete(2)沒有執行的話;  銀行轉賬 回滾 是資料庫的原子性 事務(Transaction) 1.TransactionScope採用

事務(Transaction) 之分散式事務TransactionScope,原子性

事物(Transaction)是訪問並可能更新資料庫中各種資料項的一個程式執行單元(unit)。事物通常由高階資料庫操縱語言或程式語言(如SQL,C++或Java)書寫的使用者程式的執行所引起,並用形如begin transaction和commit transaction

使用TransactionScope分散式事務協調

//場景是使用在多個數據庫之間的協調,.NET 2.0使用一個新的型別 TransactionScope來進行協調,這與之前的COM+協調是相對來說更加方便的 //需要引用一個新的程式集:System.Transactions//需要特別注意一個地方,Transaction

使用者註冊登入案例分析以及簡單實現

使用者註冊登入案例 功能分析 本案例主要是使用者註冊和登入功能。根據使用者輸入的使用者名稱和密碼判斷使用者能否登入進去。使用者的資訊儲存在userInformation.txt檔案中。 分析順序如下: 1. 分包和建類 2. 實現功能 分

Asp.Net 自帶的分散式事務TransactionScope)的程式碼塊

using (TransactionScope scope = new TransactionScope()) { //建立事物物件 try { //執行事務操作的相關程式碼 scope.Complete(); /

分散式鎖,分散式事務以及解決方案瞭解一下

一、分散式鎖 1、什麼是分散式鎖? 場景1:常規的我們多執行緒訪問同一程式碼塊的時候,為了保證同一時間只能 由一個執行緒訪問,保證資料安全一致性,通常我們使用synchronized關鍵字來對方法加鎖,以達到保證資料安全性。 場景2:現在越來越多的專案,為了追求效能與高