C#分布式事务(TransactionScope )
?????? 下列代碼就是一個正在創(chuàng)建的事務,這個事務自身還封裝了多個數(shù)據(jù)庫查詢。只要任意一個 SqlCommand 對象引發(fā)異常,程序流控制就會跳出 TransactionScope 的 using 語句塊,隨后,TransactionScope 將自行釋放并回滾該事務。由于這段代碼使用了 using 語句,所以 SqlConnection 對象和 TransactionScope 對象都將被自動調(diào)用Dispose()釋放。由此可見,只需添加很少的幾行代碼,您就可以構(gòu)建出一個事務模型,這個模型可以對異常進行處理,執(zhí)行結(jié)束后會自行清理,此外,它還可以對命令的提交或回滾進行管理。
//創(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();
}
連接字符串關鍵字(Enlist)
?????? SqlConnection.ConnectionString 屬性支持關鍵字 Enlist,該關鍵字指示 System.Data.SqlClient 是否將檢測事務上下文并自動在分布式事務中登記連接。 如果 Enlist=true,連接將自動在打開的線程的當前事務上下文中登記。 如果 Enlist=false,SqlClient 連接不會與分布式事務進行交互。 Enlist 的默認值為 true。 如果連接字符串中未指定 Enlist,若在連接打開時檢測到一個,連接將自動在分布式事務中登記。??
??????? 上面所看到的示例中我們使用了TransactionScope的默認設置。TransactionScope有三種模式:
| TransactionScopeOptions | 描述 |
| Required | 如果已經(jīng)存在一個事務,那么這個事務范圍將加入已有的事務。否則,它將創(chuàng)建自己的事務。 |
| RequiresNew | 這個事務范圍將創(chuàng)建自己的事務。 |
| Suppress | 如果處于當前活動事務范圍內(nèi),那么這個事務范圍既不會加入氛圍事務 (ambient transaction),也不會創(chuàng)建自己的事務。當部分代碼需要留在事務外部時,可以使用該選項。 |
?????? 若要更改 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í)行另一條命令。??????
{
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj2479与poj2593 , 同一
- 下一篇: c# char unsigned_dll