C#分布式事务(TransactionScope )
?????? 下列代碼就是一個(gè)正在創(chuàng)建的事務(wù),這個(gè)事務(wù)自身還封裝了多個(gè)數(shù)據(jù)庫(kù)查詢(xún)。只要任意一個(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)行管理。
//創(chuàng)建TransactionScopeusing (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)在打開(kāi)的線程的當(dāng)前事務(wù)上下文中登記。 如果 Enlist=false,SqlClient 連接不會(huì)與分布式事務(wù)進(jìn)行交互。 Enlist 的默認(rèn)值為 true。 如果連接字符串中未指定 Enlist,若在連接打開(kāi)時(shí)檢測(cè)到一個(gè),連接將自動(dòng)在分布式事務(wù)中登記。??
??????? 上面所看到的示例中我們使用了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)。 | 
?????? 若要更改 TransactionScope 類(lèi)的默認(rèn)設(shè)置,您可以創(chuàng)建一個(gè) TransactionOptions 對(duì)象,然后通過(guò)它在 TransactionScope 對(duì)象上設(shè)置隔離級(jí)別和事務(wù)的超時(shí)時(shí)間。TransactionOptions 類(lèi)有一個(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 類(lèi)還有一個(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秒
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í)行另一條命令。??????
{
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 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: poj2479与poj2593 , 同一
- 下一篇: silverlight中常用公共函数分享
