欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中TransactionScope的使用小結(jié)

 更新時(shí)間:2014年01月17日 08:59:22   作者:  
本篇文章主要是對(duì)C#中TransactionScope的使用方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助

TransactionScope是.Net Framework 2.0滯后,新增了一個(gè)名稱空間。它的用途是為數(shù)據(jù)庫(kù)訪問(wèn)提供了一個(gè)“輕量級(jí)”[區(qū)別于:SqlTransaction]的事務(wù)。使用之前必須添加對(duì) System.Transactions.dll 的引用。

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

復(fù)制代碼 代碼如下:

//創(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();
}


連接字符串關(guān)鍵字(Enlist)
SqlConnection.ConnectionString 屬性支持關(guān)鍵字 Enlist,該關(guān)鍵字指示 System.Data.SqlClient 是否將檢測(cè)事務(wù)上下文并自動(dòng)在分布式事務(wù)中登記連接。 如果 Enlist=true,連接將自動(dòng)在打開的線程的當(dāng)前事務(wù)上下文中登記。 如果 Enlist=false,SqlClient 連接不會(huì)與分布式事務(wù)進(jìn)行交互。 Enlist 的默認(rèn)值為 true。 如果連接字符串中未指定 Enlist,若在連接打開時(shí)檢測(cè)到一個(gè),連接將自動(dòng)在分布式事務(wù)中登記。
復(fù)制代碼 代碼如下:

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

上面所看到的示例中我們使用了TransactionScope的默認(rèn)設(shè)置。TransactionScope有三種模式:

TransactionScopeOptions

描述

Required

如果已經(jīng)存在一個(gè)事務(wù),那么這個(gè)事務(wù)范圍將加入已有的事務(wù)。否則,它將創(chuàng)建自己的事務(wù)。

RequiresNew

這個(gè)事務(wù)范圍將創(chuàng)建自己的事務(wù)。

Suppress

如果處于當(dāng)前活動(dòng)事務(wù)范圍內(nèi),那么這個(gè)事務(wù)范圍既不會(huì)加入氛圍事務(wù) (ambient transaction),也不會(huì)創(chuàng)建自己的事務(wù)。當(dāng)部分代碼需要留在事務(wù)外部時(shí),可以使用該選項(xiàng)。

您可以在代碼的任何位置上隨是查看是否存在事務(wù)范圍,具體方法就是查看 System.Transactions.Transaction.Current 屬性。如果這個(gè)屬性為“null”,說(shuō)明不存在當(dāng)前事務(wù)。

若要更改 TransactionScope 類的默認(rèn)設(shè)置,您可以創(chuàng)建一個(gè) TransactionOptions 對(duì)象,然后通過(guò)它在 TransactionScope 對(duì)象上設(shè)置隔離級(jí)別和事務(wù)的超時(shí)時(shí)間。TransactionOptions 類有一個(gè) IsolationLevel 屬性,通過(guò)這個(gè)屬性可以更改隔離級(jí)別,例如從默認(rèn)的可序列化 (Serializable) 改為ReadCommitted,甚至可以改為 SQL Server 2005 引入的新的快照 (Snapshot) 級(jí)別。(請(qǐng)記住,隔離級(jí)別僅僅是一個(gè)建議。大多數(shù)數(shù)據(jù)庫(kù)引擎會(huì)試著使用建議的隔離級(jí)別,但也可能選擇其他級(jí)別。)此 外,TransactionOptions 類還有一個(gè) TimeOut 屬性,這個(gè)屬性可以用來(lái)更改超時(shí)時(shí)間(默認(rèn)設(shè)置為 1 分鐘)。

下列代碼中使用了默認(rèn)的 TransactionScope 對(duì)象及其默認(rèn)構(gòu)造函數(shù)。也就是說(shuō),它的隔離級(jí)別設(shè)置為可序列化 (Serializable),事務(wù)的超時(shí)時(shí)間為 1 分鐘,而且 TransactionScopeOptions 的設(shè)置為 Required。

TransactionOptions tOpt= new TransactionOptions();
//設(shè)置TransactionOptions模式
tOpt.IsolationLevel= IsolationLevel.ReadCommitted;
// 設(shè)置超時(shí)間隔為2分鐘,默認(rèn)為60秒

復(fù)制代碼 代碼如下:

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();
}

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

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();
}
}

總結(jié):
進(jìn)入和退出事務(wù)都要快,這一點(diǎn)非常重要,因?yàn)槭聞?wù)會(huì)鎖定寶貴的資源。最佳實(shí)踐要求我們?cè)谛枰褂檬聞?wù)之前再去創(chuàng)建它,在需要對(duì)其執(zhí)行命令前迅速打開連接, 執(zhí)行動(dòng)作查詢 (Action Query),并盡可能快地完成和釋放事務(wù)。在事務(wù)執(zhí)行期間,您還應(yīng)該避免執(zhí)行任何不必要的、與數(shù)據(jù)庫(kù)無(wú)關(guān)的代碼,這能夠防止資源被毫無(wú)疑義地鎖定過(guò)長(zhǎng)的 時(shí)間。

使用注意:TransactionScope事務(wù)需要開啟一些服務(wù),(如果數(shù)據(jù)庫(kù)不在本地,服務(wù)器和客戶端都需要開啟以下服務(wù)和組件服務(wù))

以下組件服務(wù)需要開啟

step1

step2:

相關(guān)文章

  • 聊聊C# 中HashTable與Dictionary的區(qū)別說(shuō)明

    聊聊C# 中HashTable與Dictionary的區(qū)別說(shuō)明

    這篇文章主要介紹了聊聊C# 中HashTable與Dictionary的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • C#對(duì)DataTable中的某列進(jìn)行分組

    C#對(duì)DataTable中的某列進(jìn)行分組

    這篇文章介紹了C#對(duì)DataTable某列進(jìn)行分組的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C#訪問(wèn)及調(diào)用類中私有成員與方法示例代碼

    C#訪問(wèn)及調(diào)用類中私有成員與方法示例代碼

    訪問(wèn)一個(gè)類的私有成員不是什么好做法,大家也都知道私有成員在外部是不能被訪問(wèn)的,這篇文章主要給大家介紹了關(guān)于C#訪問(wèn)及調(diào)用類中私有成員與方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-06-06
  • C#實(shí)現(xiàn)影院售票系統(tǒng)

    C#實(shí)現(xiàn)影院售票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)影院售票系統(tǒng),解析了售票系統(tǒng)的難點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • c#入門之枚舉和結(jié)構(gòu)體使用詳解(控制臺(tái)接收字符串以相反的方向輸出)

    c#入門之枚舉和結(jié)構(gòu)體使用詳解(控制臺(tái)接收字符串以相反的方向輸出)

    這篇文章主要介紹了c#入門之枚舉和結(jié)構(gòu)體使用詳解,最后提供了編寫控制臺(tái)應(yīng)用程序接收字符串并做相應(yīng)處理的小示例,需要的朋友可以參考下
    2014-04-04
  • C# 連接SQL數(shù)據(jù)庫(kù)的方法及常用連接字符串

    C# 連接SQL數(shù)據(jù)庫(kù)的方法及常用連接字符串

    這篇文章主要介紹了C# 連接SQL數(shù)據(jù)庫(kù)的方法及常用連接字符串,有需要的朋友可以參考一下
    2014-01-01
  • C#使用Task實(shí)現(xiàn)異步方法

    C#使用Task實(shí)現(xiàn)異步方法

    本文主要介紹了C#使用Task實(shí)現(xiàn)異步方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C#實(shí)現(xiàn)串口通信的示例詳解

    C#實(shí)現(xiàn)串口通信的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單串口通信的相關(guān)知識(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-03-03
  • Winform窗體效果實(shí)例分析

    Winform窗體效果實(shí)例分析

    這篇文章主要介紹了Winform窗體效果,涉及WinForm窗體設(shè)計(jì)的常見(jiàn)參數(shù)設(shè)置及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • c#集合快速排序類實(shí)現(xiàn)代碼分享

    c#集合快速排序類實(shí)現(xiàn)代碼分享

    這篇文章主要介紹了C#實(shí)現(xiàn)集合排序類,大家參考使用吧
    2013-12-12

最新評(píng)論