日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#分布式事务(TransactionScope )

發(fā)布時間:2024/9/5 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#分布式事务(TransactionScope ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
TransactionScope是.Net Framework 2.0后,新增了一個名稱空間。它的用途是為數(shù)據(jù)庫訪問提供了一個“輕量級”[區(qū)別于:SqlTransaction]的事物。使用之前必須添加對 System.Transactions.dll 的引用。

?????? 下列代碼就是一個正在創(chuàng)建的事務,這個事務自身還封裝了多個數(shù)據(jù)庫查詢。只要任意一個 SqlCommand 對象引發(fā)異常,程序流控制就會跳出 TransactionScope 的 using 語句塊,隨后,TransactionScope 將自行釋放并回滾該事務。由于這段代碼使用了 using 語句,所以 SqlConnection 對象和 TransactionScope 對象都將被自動調(diào)用Dispose()釋放。由此可見,只需添加很少的幾行代碼,您就可以構(gòu)建出一個事務模型,這個模型可以對異常進行處理,執(zhí)行結(jié)束后會自行清理,此外,它還可以對命令的提交或回滾進行管理。

//創(chuàng)建TransactionScope
using (TransactionScope tsCope = new TransactionScope())
{
  
using (SqlConnection cn2005 = new SqlConnection(someSql2005))
  
{
    SqlCommand cmd
= new SqlCommand(sqlUpdate, cn2005);
    cn2005.Open();
    cmd.ExecuteNonQuery();
  }

  
using (SqlConnection cn2005 = new SqlConnection(anotherSql2005))
  
{
    SqlCommand cmd
= new SqlCommand(sqlDelete, cn2005);
    cn2005.Open();
    cmd.ExecuteNonQuery();
  }


  tsCope.Complete();
}

   連接字符串關鍵字(Enlist)
?????? SqlConnection.ConnectionString 屬性支持關鍵字 Enlist,該關鍵字指示 System.Data.SqlClient 是否將檢測事務上下文并自動在分布式事務中登記連接。 如果 Enlist=true,連接將自動在打開的線程的當前事務上下文中登記。 如果 Enlist=false,SqlClient 連接不會與分布式事務進行交互。 Enlist 的默認值為 true。 如果連接字符串中未指定 Enlist,若在連接打開時檢測到一個,連接將自動在分布式事務中登記。??

Server=(local)SQL2005;Database=Northwind;Integrated Security=SSPI;auto-enlist=false

??????? 上面所看到的示例中我們使用了TransactionScope的默認設置。TransactionScope有三種模式:

TransactionScopeOptions描述
Required如果已經(jīng)存在一個事務,那么這個事務范圍將加入已有的事務。否則,它將創(chuàng)建自己的事務。
RequiresNew這個事務范圍將創(chuàng)建自己的事務。
Suppress如果處于當前活動事務范圍內(nèi),那么這個事務范圍既不會加入氛圍事務 (ambient transaction),也不會創(chuàng)建自己的事務。當部分代碼需要留在事務外部時,可以使用該選項。
?????? 您可以在代碼的任何位置上隨是查看是否存在事務范圍,具體方法就是查看 System.Transactions.Transaction.Current 屬性。如果這個屬性為“null”,說明不存在當前事務。
?????? 若要更改 TransactionScope 類的默認設置,您可以創(chuàng)建一個 TransactionOptions 對象,然后通過它在 TransactionScope 對象上設置隔離級別和事務的超時時間。TransactionOptions 類有一個 IsolationLevel 屬性,通過這個屬性可以更改隔離級別,例如從默認的可序列化 (Serializable) 改為ReadCommitted,甚至可以改為 SQL Server 2005 引入的新的快照 (Snapshot) 級別。(請記住,隔離級別僅僅是一個建議。大多數(shù)數(shù)據(jù)庫引擎會試著使用建議的隔離級別,但也可能選擇其他級別。)此外,TransactionOptions 類還有一個 TimeOut 屬性,這個屬性可以用來更改超時時間(默認設置為 1 分鐘)。
?????? 下列代碼中使用了默認的 TransactionScope 對象及其默認構(gòu)造函數(shù)。也就是說,它的隔離級別設置為可序列化 (Serializable),事務的超時時間為 1 分鐘,而且 TransactionScopeOptions 的設置為 Required。

TransactionOptions tOpt = new TransactionOptions();
//設置TransactionOptions模式
tOpt.IsolationLevel = IsolationLevel.ReadCommitted;
// 設置超時間隔為2分鐘,默認為60秒
tOpt.Timeout = new TimeSpan(0, 2, 0);
string cnString = ConfigurationManager.ConnectionStrings["sql2005DBServer"].ConnectionString);

using (TransactionScope tsCope = new TransactionScope(TransactionScopeOption.RequiresNew, tOpt))
{
  
using (SqlConnection cn2005 = new SqlConnection(cnString)
  {
    SqlCommand cmd
= new SqlCommand(updateSql1, cn2005);
    cn2005.Open();
    cmd.ExecuteNonQuery();
  }

  tsCope.Complete();
}

??????? 嵌套應用
????? 如下列代碼,假設 Method1 創(chuàng)建一個 TransactionScope,針對一個數(shù)據(jù)庫執(zhí)行一條命令,然后調(diào)用 Method2。Method2 創(chuàng)建一個自身的 TransactionScope,并針對一個數(shù)據(jù)庫執(zhí)行另一條命令。??????

private void Method1()
{
  
using (TransactionScope ts =
    
new TransactionScope(TransactionScopeOption.Required))
  {
    
using (SqlConnection cn2005 = new SqlConnection())
    {
      SqlCommand cmd
= new SqlCommand(updateSql1, cn2005);
      cn2005.Open();
      cmd.ExecuteNonQuery();
    }
    Method2();
    ts.Complete();
  }
}
private void Method2()
{
  
using (TransactionScope ts =
    
new TransactionScope(TransactionScopeOption.RequiresNew))
  {
    
using (SqlConnection cn2005 = new SqlConnection())
    {
      SqlCommand cmd
= new SqlCommand(updateSql2, cn2005);
      cn2005.Open();
      cmd.ExecuteNonQuery();
    }
    ts.Complete();
  }
}

轉(zhuǎn)載于:https://www.cnblogs.com/kingangWang/archive/2011/08/15/2139486.html

總結(jié)

以上是生活随笔為你收集整理的C#分布式事务(TransactionScope )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。