亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中TransactionScope的使用小結

2020-01-24 02:52:58
字體:
來源:轉載
供稿:網友

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

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

復制代碼 代碼如下:

//創建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;enlist=false

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

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 分鐘)。

下列代碼中使用了默認的 TransactionScope 對象及其默認構造函數。也就是說,它的隔離級別設置為可序列化 (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 創建一個 TransactionScope,針對一個數據庫執行一條命令,然后調用 Method2。Method2 創建一個自身的 TransactionScope,并針對一個數據庫執行另一條命令。   
復制代碼 代碼如下:

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

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

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

以下組件服務需要開啟

step1

step2:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品吴梦梦| 亚洲国产高潮在线观看| 日韩av在线播放资源| 国产精品亚洲аv天堂网| 欧美精品免费在线观看| 亚洲国产精品久久久久| 911国产网站尤物在线观看| 久久久精品999| 亚洲美女久久久| xvideos成人免费中文版| 欧美视频精品一区| 亚洲第一视频网站| 国产精品电影在线观看| 日韩在线观看免费| 日韩高清电影免费观看完整| 97精品国产97久久久久久免费| 日韩欧美精品网址| 欧美第一黄色网| 成人免费xxxxx在线观看| 丰满岳妇乱一区二区三区| 97精品久久久中文字幕免费| 欧美日韩国产一区二区三区| 国产日韩在线精品av| 亚洲综合中文字幕在线观看| 亚洲国产天堂久久国产91| 欧美激情一区二区三区在线视频观看| 91成人性视频| 精品久久久久久久中文字幕| 国产精品色婷婷视频| 亚洲第一天堂无码专区| 在线观看久久久久久| 亚洲va码欧洲m码| 国产成人在线亚洲欧美| 国产精品福利在线观看网址| 欧美在线影院在线视频| 日韩小视频在线| 欧美日韩一区二区三区在线免费观看| 2019最新中文字幕| 久久人人97超碰精品888| 国产精品草莓在线免费观看| 国产精品久久久久av| 成人网址在线观看| 91精品国产精品| 欧美日韩成人免费| 日韩欧美视频一区二区三区| 精品国产乱码久久久久久婷婷| 日韩av在线看| 最近2019中文字幕在线高清| 成人亚洲综合色就1024| 欧美精品成人91久久久久久久| 亚洲视屏在线播放| 欧美极品欧美精品欧美视频| 日韩综合中文字幕| 国产综合在线看| 国产精品久久999| 亚洲视频在线观看免费| 国产精品一区久久| 国产精品三级久久久久久电影| 91国产美女视频| 韩国19禁主播vip福利视频| 久久网福利资源网站| 久久影视三级福利片| 国产精品日韩专区| 欧美精品18videosex性欧美| 久久久爽爽爽美女图片| 欧美日韩午夜激情| 国产91精品高潮白浆喷水| 欧美激情精品久久久久久蜜臀| 黑人极品videos精品欧美裸| 久久这里只有精品99| 精品国产一区av| 国产精品91免费在线| 亚洲自拍偷拍区| 国产成人精品午夜| 色综合久久久888| 国产精品久久久久久亚洲影视| 国产精品视频公开费视频| 国产精品久久久久久久久久尿| 欧美巨乳美女视频| 精品丝袜一区二区三区| 国产精品直播网红| 国产精品综合网站| 国产精品2018| 久久久99久久精品女同性| 欧美日韩国产成人| 国产成人在线视频| 欧美区二区三区| 国内精品美女av在线播放| 亚洲激情第一页| 热久久这里只有| 热99精品里视频精品| 97视频在线播放| 92国产精品视频| 久久精品视频99| 国产剧情久久久久久| 国产精品吹潮在线观看| 久久香蕉精品香蕉| 久青草国产97香蕉在线视频| 日本国产欧美一区二区三区| 日韩欧美精品网站| 日韩免费看的电影电视剧大全| 欧美成人精品在线视频| 日韩中文字幕免费| 精品国产999| 亚洲人成网站免费播放| 一区二区三区四区在线观看视频| 91在线高清免费观看| 日韩在线免费高清视频| 亚洲精品久久在线| 久久精品亚洲一区| 亚洲tv在线观看| 成人欧美一区二区三区黑人孕妇| 日韩av大片在线| 亚洲国产婷婷香蕉久久久久久| 91av在线视频观看| 韩国三级日本三级少妇99| 国产精品入口福利| 亚洲男人天堂久| 亚洲a成v人在线观看| 欧美高清在线视频观看不卡| 成人免费在线网址| 91九色视频在线| 美女黄色丝袜一区| 7m精品福利视频导航| 亚洲电影免费观看| 韩剧1988免费观看全集| 亚洲国产欧美精品| 欧美自拍大量在线观看| 成人免费视频网| 欧美寡妇偷汉性猛交| 欧美大全免费观看电视剧大泉洋| 亚洲奶大毛多的老太婆| 国产精品一区=区| 欧美午夜宅男影院在线观看| 91精品久久久久久综合乱菊| 欧美激情a在线| 91久久久久久久一区二区| 精品久久中文字幕| 国产精品视频不卡| 日韩精品视频在线免费观看| 欧美激情在线观看| 国产97在线播放| 啊v视频在线一区二区三区| 91日本在线视频| 久久成年人免费电影| 国产成人精品999| 欧美午夜激情小视频| 久久五月天色综合| 日本中文字幕成人| 高清欧美性猛交| 欧美激情女人20p| 高潮白浆女日韩av免费看| 欧美洲成人男女午夜视频| 欧美日韩国产中文字幕| 国产精品视频区| 午夜精品一区二区三区在线播放| 国产在线一区二区三区| 国产日韩精品入口| 亚洲一区二区三区xxx视频| 日本精品免费观看| 午夜精品久久久久久久白皮肤| 高清在线视频日韩欧美| 成人精品视频久久久久| 国产成人精品免高潮在线观看|