TransactionScope 分散式事務的使用案例 以及簡單說明
http://www.cnblogs.com/zhbsh/archive/2011/05/14/2046042.html
TransactionScope 是的.net Framework2.0版本中增加的一個新名稱空間。他的用途是為資料庫訪問提供一個“輕量級”的事物。使用之前必須新增對 System.Transactions.dll 的引用。先介紹介紹幾個簡單的引數。
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 分鐘)。
TransactionOptions opt
//設定TransactionOptions
opt.IsolationLevel = IsolationLevel.ReadCommitted;
// 設定超時間隔為2分鐘,預設為60秒opt.Timeout =new TimeSpan(0, 2, 0);
使用時候將
using (TransactionScope sCope =new TransactionScope(TransactionScopeOption.RequiresNew, opt))
其他和預設一樣
下面做一個簡單的demo 只需要新增很少的幾行程式碼,這個模型可以對異常進行處理,執行結束後會自行清理,此外,它還可以對命令的提交或回滾進行管理
1.TransactionScope 在一個事務範圍內
在app.config中
<connectionStrings>
<add name="myCon" connectionString="Data Source=.;uid=sa;pwd=sa;database=B2C3;Asynchronous Processing=true"/>
<add name="myCon2" connectionString="Data Source=.;uid=sa;pwd=sa;database=b2c;Asynchronous Processing=true"/>
<add name="myCon3" connectionString="Data Source=.;uid=sa;pwd=sa;database=demo;Asynchronous Processing=true"/>
<add name="myCon4" connectionString="Data Source=.;uid=sa;pwd=sa;database=News;Asynchronous Processing=true"/>
</connectionStrings>
static void Main(string[] args)
{
string constr = ConfigurationManager.ConnectionStrings["myCon"].ConnectionString;
string constr2 = ConfigurationManager.ConnectionStrings["myCon2"].ConnectionString;
string sql = "insert into [Tuser](username,pwd,age) values('新聞socpe測試','bbb',10)";
#region 不同庫的事務
using (TransactionScope sope = new TransactionScope())
{
using(SqlConnection con =new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
con.Open();
int a= cmd.ExecuteNonQuery();
Console.WriteLine(a);
}
}
using (SqlConnection con = new SqlConnection(constr2))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
con.Open();
int b = cmd.ExecuteNonQuery();
Console.WriteLine(b);
}
}
addOtherUser();
sope.Complete();
}
#endregion
sope.Complete(); 是個標示。只有全部執行才提交事務
2.巢狀 呼叫事務
static void Main(string[] args)
{
string constr = ConfigurationManager.ConnectionStrings["myCon"].ConnectionString;
string constr2 = ConfigurationManager.ConnectionStrings["myCon2"].ConnectionString;
string sql = "insert into [Tuser](username,pwd,age) values('新聞socpe測試','bbb',10)";
#region 不同庫的事務
using (TransactionScope sope = new TransactionScope(TransactionScopeOption.Required))
{
using(SqlConnection con =new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
con.Open();
int a= cmd.ExecuteNonQuery();
Console.WriteLine(a);
}
}
using (SqlConnection con = new SqlConnection(constr2))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
con.Open();
int b = cmd.ExecuteNonQuery();
Console.WriteLine(b);
}
}
addOtherUser();
sope.Complete();
}
#endregion
}
private static void addOtherUser()
{
string constr3 = ConfigurationManager.ConnectionStrings["myCon3"].ConnectionString;
string constr4 = ConfigurationManager.ConnectionStrings["myCon4"].ConnectionString;
string sql1 = "insert into [hr_user](username,password) values('新聞socpe測試','bbb')";
string sql2 = "insert into [Users](username,userpwd) values('新聞socpe測試','bbb')";
//RequiresNew 這個事務範圍將建立自己的事務。
using(TransactionScope sope=new TransactionScope(TransactionScopeOption.RequiresNew))
{
using (SqlConnection con = new SqlConnection(constr3))
{
using (SqlCommand cmd = new SqlCommand(sql1, con))
{
con.Open();
int a = cmd.ExecuteNonQuery();
Console.WriteLine(a);
}
}
using (SqlConnection con = new SqlConnection(constr4))
{
using (SqlCommand cmd = new SqlCommand(sql2, con))
{
con.Open();
int b = cmd.ExecuteNonQuery();
Console.WriteLine(b);
}
}
sope.Complete();
}
}
總結:
現在知道了TransactionScope中的資料庫操作實際是參與了其中的環境事務,將它理解為是自動建立的SqlTransaction,而巢狀在其中的TransactionScope中的資料庫操作會新增到這個環境事務中(以TransactionScopeOption.Required為引數生成的TransactionScope)。
也知道了Complete方法並不是執行後,就會提交事務,而只是表明之前的動作都符合要求,只是一種確認,不執行該方法,事務便不能完成。而只有最外層TransactionScope執行了Complete方法後,在離開using塊時,事務才真正的提交。所以說TransactionScope是能巢狀的。
Transaction類有一靜態屬性Current,在一個TransactionScope中的Complete方法執行之前可以訪問,它返回的便是環境事務。
但是: 進入和退出事務都要快,這一點非常重要,因為事務會鎖定寶貴的資源。最佳實踐要求我們在需要使用事務之前再去建立它,在需要對其執行命令前迅速開啟連線,執行動作查詢 (Action Query),並儘可能快地完成和釋放事務。在事務執行期間,您還應該避免執行任何不必要的、與資料庫無關的程式碼,這能夠防止資源被毫無疑義地鎖定過長的時間
相關推薦
TransactionScope 分散式事務的使用案例 以及簡單說明
http://www.cnblogs.com/zhbsh/archive/2011/05/14/2046042.html TransactionScope 是的.net Framework2.0版本中增加的一個新名稱空間。他的用途是為資料庫訪問提供一個“輕量級”的事物
ActiveMQ解決分散式事務方案以及程式碼實現(一)
1.場景描述 可以設想一個比較常見的分散式事務場景,商品上架操作,該操作涉及到商品模組的Service服務中的上架操作,同時必須要滿足在solr中建立商品的索引方便前臺搜尋以及生成商品的靜態化頁面,在上架操作中傳送了一條訊息,訊息接收方搜尋工程以及靜態化工程分
TransactionScope分散式事務,將兩個資料庫操作放在一個事務中
一、概念 1、在專案中引用using System.Transactions名稱空間(先要在新增net元件的引用); TransactionScope有三種模式: TransactionScopeOptions 描述 Required 如果已經存在一個事務,那麼這個事務範
TransactionScope分散式事務
TransactionScope是.Net Framework 2.0滯後,新增了一個名稱空間。它的用途是為資料庫訪問提供了一個“輕量級”[區別於:SqlTransaction]的事物。使用之前必須新增對 System.Transactions.dll 的引用。
分散式事務之——tcc-transaction分散式TCC型事務框架搭建與實戰案例【轉】
一、背景 有一定分散式開發經驗的朋友都知道,產品/專案/系統最初為了能夠快速迭代上線,往往不太注重產品/專案/系統的高可靠性、高效能與高擴充套件性,採用單體應用和單例項資料庫的架構方式快速迭代開發;當產品/專案/系統做到一定規模的時候,原有的系統架構則不足以支撐義務發展需要,往往相同的業務則需要
分散式事務以及鎖
標題格 1、非公平鎖 2、TCC分散式事務 1、非公平鎖 在加鎖過程,執行緒1執行,執行緒2處於等待佇列。 執行緒1執行結束,結果執行緒3搶先於執行緒2進行。這就是非公平鎖的簡單含義。 在ReentrantLock lock = new ReentrantLock()預設的就是非公平鎖,建構
springcloud 中使用redis以及rabbitMQ實現分散式事務
分散式事務的補償機制,在很多成熟的案例都是使用TCC機制,來實現資源凍結,以及提交,失敗則釋放資源,很多情況下,處理業務的特殊情況需要對不支援事務的redis進行手動的事務補償。 比如,現在人臉識別入庫的服務,演算法識別人臉的服務,這兩個是依賴性比較高的服務,而且存在長事務,如果需要查詢頻繁
BMP影象資料格式詳解以及簡單案例
一.簡介 BMP(Bitmap-File)圖形檔案是Windows採用的圖形檔案格式,在Windows環境下執行的所有圖象處理軟體都支援BMP圖象檔案格式。Windows系統內部各影象繪製操作都是以BMP為基礎的。Windows 3.0以前的BMP圖檔案格式與顯示裝置有關,因此把這種BMP圖象檔
[轉載]TransactionScope和分散式事務
原文連結:http://www.cnblogs.com/cn_wpf/archive/2007/08/06/844766.html 分散式事務聽起來很不錯,其實不然。它只是儘可能的降低資料不一致的可能性,並不能完全避免。從我的應用中來看,總數約5千萬的操作,錯了十幾個。當然,這個錯誤率完全可以忍
將不確定變為確定~transactionscope何時提升為分散式事務~SQL2005與SQL2008不同
回到目錄 Transactionscope何時被提升為分散式事務,即時要觸發msdtc服務,這個問題與資料庫版本有關,在前面的文章中,我的MSTDC系列出現了多個版本,有一點沒有說清楚,測試的環境不同,所以產生了多個版本,下面我做一下總結: 一 資料庫與WWW伺服器不在一臺電腦,資料庫為SQL20
將不確定變為確定~transactionscope何時提升為分散式事務?(sql2005資料庫解決提升到MSDTC的辦法)
回到目錄 對於transactionscope不瞭解的同學,可以看我的相關文章 宣告: 對於這種事務,如果希望程式出錯自動回滾,必須將異常throw出來,不能愉愉的用日誌記錄! 測試: 對於sql2008已經很好的支援了transactionscope,而對於sql2005來說,支援的不是很好,
第一次有人把“分散式事務”講的這麼簡單明瞭
又或者在網上購物明明已經扣款,但是卻告訴我沒有發生交易。這一系列情況都是因為沒有事務導致的。這說明了事務在生活中的一些重要性。 有了事務,你去小賣鋪買東西,那就是一手交錢一手交貨。有了事務,你去網上購物,扣款即產生訂單交易。 事務的具體定義 事務提供一種機制將一個活動涉
MyBatis的環境搭建以及簡單案例
MyBatis的環境搭建以及簡單案例 MyBatis框架簡介 資料持久化(概念) ORM(資料持久化技術) MyBatis環境搭建 MyBatis框架簡介 MyBatis的前身是iBatis,是一個開源的資料
基於訊息的分散式事務簡單方案
System-A為主系統 流程描述 1. system-A執行本地事務, 傳送msg到redis,此時msg狀態為unknown(這裡全是unknown狀態的msg,訊息需要持久化,只有msg存在,即使system-b處理失敗也可以有其他方式處理,一般是人工) 2.1
【黑馬程式設計師】分散式事務TransactionScope(學習筆記)
分散式事務: btnDel_Click() { Delete(1); Delete(2); } 如果 Delete(1)執行後Delete(2)沒有執行的話; 銀行轉賬 回滾 是資料庫的原子性 事務(Transaction) 1.TransactionScope採用
事務(Transaction) 之分散式事務TransactionScope,原子性
事物(Transaction)是訪問並可能更新資料庫中各種資料項的一個程式執行單元(unit)。事物通常由高階資料庫操縱語言或程式語言(如SQL,C++或Java)書寫的使用者程式的執行所引起,並用形如begin transaction和commit transaction
使用TransactionScope做分散式事務協調
//場景是使用在多個數據庫之間的協調,.NET 2.0使用一個新的型別 TransactionScope來進行協調,這與之前的COM+協調是相對來說更加方便的 //需要引用一個新的程式集:System.Transactions//需要特別注意一個地方,Transaction
使用者註冊登入案例分析以及簡單實現
使用者註冊登入案例 功能分析 本案例主要是使用者註冊和登入功能。根據使用者輸入的使用者名稱和密碼判斷使用者能否登入進去。使用者的資訊儲存在userInformation.txt檔案中。 分析順序如下: 1. 分包和建類 2. 實現功能 分
Asp.Net 自帶的分散式事務(TransactionScope)的程式碼塊
using (TransactionScope scope = new TransactionScope()) { //建立事物物件 try { //執行事務操作的相關程式碼 scope.Complete(); /
分散式鎖,分散式事務以及解決方案瞭解一下
一、分散式鎖 1、什麼是分散式鎖? 場景1:常規的我們多執行緒訪問同一程式碼塊的時候,為了保證同一時間只能 由一個執行緒訪問,保證資料安全一致性,通常我們使用synchronized關鍵字來對方法加鎖,以達到保證資料安全性。 場景2:現在越來越多的專案,為了追求效能與高