.Net各類事務彙總

1、SQL事務

優點:執行效率最佳

限制:事務上下文僅在數據庫中調用,難以實現複雜的業務邏輯。

CREATE PROCEDURE Tran1  
as  
begin tran  
set xact_abort on 
Insert Into trantest (id,test)values(1,'test')  
Insert Into trantest (id,test)values(2,'test')  
commit tran  
GO  
--set xact_abort on  表示遇到錯誤立即回滾 
--當然你也可以這麼寫 
CREATE PROCEDURE tran1 
as 
begin tran 
insert into trantest(id,test)values(1,'test') 
if(@@error<>0) 
 rollback tran 
else 
 begin 
  insert into trantest(id,test)values(2,'test') 
  if(@@error<>0) 
   rollback tran 
  else 
   commit tran 
 end 
GO 

2、ADO.NET 事務

在ADO.NET 中,可以使用Connection 和Transaction 對象來控制事務。若要執行事務,請執行下列操作:
調用Connection 對象的BeginTransaction 方法來標記事務的開始。
將Transaction 對象分配給要執行的Command的Transaction 屬性。
執行所需的命令。

調用Transaction 對象的Commit 方法來完成事務,或調用Rollback 方法來取消事務。


優點:簡單,效率和數據庫事務差不多快。

缺點:事務執行在數據庫連接層上,所以你需要在事務過程中手動的維護一個連接。

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString);
 conn.Open();
 SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);
 SqlCommand cmd = new SqlCommand();
 cmd.Connection = conn;
 cmd.Transaction = tx;
 
 try
 {
     cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('測試1','1')";
     cmd.ExecuteNonQuery();
     cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('測試2','2')";
     cmd.ExecuteNonQuery();
 
     tx.Commit();
 }
 catch (Exception ex)
 {
     tx.Rollback();
     throw new Exception(ex.Message, ex);
 }
 finally
 {
     conn.Close();
 }

3、TransactionScope事務

在.NET 2.0中新添加了一個名爲System.Transactions的命名空間,其提供了一個“輕量級”的、易於使用的事務框架,通過這個框架可以大大簡化事務的操作。
這個框架提供瞭如下優點:
(1)在簡單(不涉及分佈式)事務中也可以使用聲明式的事務處理方法,而不必使用Com+容器和目錄註冊。
(2)用戶根本不需要考慮是簡單事務還是分佈式事務。它實現一種所謂自動提升事務機制(Promotable Transaction),會自動根據事務中涉及的對象資源判斷使用何種事務管理器。
TransactionScope事務類,它可以使代碼塊成爲事務性代碼。並自動提升爲分佈式事務

優點:實現簡單,同時能夠自動提升爲分佈式事務

 TransactionOptions option = new TransactionOptions();
 option.IsolationLevel = IsolationLevel.ReadCommitted;
 
 using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,option))
 {
     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))
     {
         conn.Open();
         SqlCommand cmd = new SqlCommand(conn);
         cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('測試1','1')";
         cmd.ExecuteNonQuery();
         cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('測試2','2')";
         cmd.ExecuteNonQuery();
     }
     ts.Complete();
 }


4、EnterpriseServices實現事務

就是利用com+實現自動處理事務。

添加引用System.EnterpriseServices.dll
using System.EnterpriseServices; 

使用方法參考:http://support.microsoft.com/default.aspx?scid=kb;zh-cn;816141

隨便建立一個按鈕,在按鈕中進行如下操作:

try  
{  
 work1();  
 work2();  
 ContextUtil.SetComplete();  
}  
catch(System.Exception except)  
{  
 ContextUtil.SetAbort();  
 Response.Write(except.Message);  
}  

然後在頁面中添加2個操作,模擬一下在邏輯層調用不同類中的操作的情況 :

private void work1()  
  {  
   SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);  
   SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);  
   conn.Open();  
   cmd1.ExecuteNonQuery();  
   conn.Close();  
  }  

  private void work2()  
  {  
   SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);  
   SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(2,'test')",conn);  
   conn.Open();  
   cmd2.ExecuteNonQuery();  
   conn.Close();  
  }  

修改前臺頁面在<%Page後面添加 Transaction="Required" 即可




發佈了79 篇原創文章 · 獲贊 16 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章