.NET的事务处理(转)

来源:互联网 发布:js ajax each 编辑:程序博客网 时间:2024/06/07 17:38

1、SQL事务

优点:执行效率最佳

限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. CREATE PROCEDURE Tran1    
  2. as    
  3. begin tran    
  4. set xact_abort on   
  5. Insert Into trantest (id,test)values(1,'test')    
  6. Insert Into trantest (id,test)values(2,'test')    
  7. commit tran    
  8. GO    
  9. --set xact_abort on  表示遇到错误立即回滚   
  10. --当然你也可以这么写   
  11. CREATE PROCEDURE tran1   
  12. as   
  13. begin tran   
  14. insert into trantest(id,test)values(1,'test')   
  15. if(@@error<>0)   
  16.  rollback tran   
  17. else   
  18.  begin   
  19.   insert into trantest(id,test)values(2,'test')   
  20.   if(@@error<>0)   
  21.    rollback tran   
  22.   else   
  23.    commit tran   
  24.  end   
  25. GO   
[sql] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. CREATE PROCEDURE Tran1    
  2. as    
  3. begin tran    
  4. set xact_abort on   
  5. Insert Into trantest (id,test)values(1,'test')    
  6. Insert Into trantest (id,test)values(2,'test')    
  7. commit tran    
  8. GO    
  9. --set xact_abort on  表示遇到错误立即回滚   
  10. --当然你也可以这么写   
  11. CREATE PROCEDURE tran1   
  12. as   
  13. begin tran   
  14. insert into trantest(id,test)values(1,'test')   
  15. if(@@error<>0)   
  16.  rollback tran   
  17. else   
  18.  begin   
  19.   insert into trantest(id,test)values(2,'test')   
  20.   if(@@error<>0)   
  21.    rollback tran   
  22.   else   
  23.    commit tran   
  24.  end   
  25. GO   


2、ADO.NET 事务

在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:
调用Connection 对象的BeginTransaction 方法来标记事务的开始。
将Transaction 对象分配给要执行的Command的Transaction 属性。
执行所需的命令。

调用Transaction 对象的Commit 方法来完成事务,或调用Rollback 方法来取消事务。


优点:简单,效率和数据库事务差不多快。

缺点:事务执行在数据库连接层上,所以你需要在事务过程中手动的维护一个连接。

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString);  
  2.  conn.Open();  
  3.  SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);  
  4.  SqlCommand cmd = new SqlCommand();  
  5.  cmd.Connection = conn;  
  6.  cmd.Transaction = tx;  
  7.    
  8.  try  
  9.  {  
  10.      cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";  
  11.      cmd.ExecuteNonQuery();  
  12.      cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";  
  13.      cmd.ExecuteNonQuery();  
  14.    
  15.      tx.Commit();  
  16.  }  
  17.  catch (Exception ex)  
  18.  {  
  19.      tx.Rollback();  
  20.      throw new Exception(ex.Message, ex);  
  21.  }  
  22.  finally  
  23.  {  
  24.      conn.Close();  
  25.  }  
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString);  
  2.  conn.Open();  
  3.  SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);  
  4.  SqlCommand cmd = new SqlCommand();  
  5.  cmd.Connection = conn;  
  6.  cmd.Transaction = tx;  
  7.    
  8.  try  
  9.  {  
  10.      cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";  
  11.      cmd.ExecuteNonQuery();  
  12.      cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";  
  13.      cmd.ExecuteNonQuery();  
  14.    
  15.      tx.Commit();  
  16.  }  
  17.  catch (Exception ex)  
  18.  {  
  19.      tx.Rollback();  
  20.      throw new Exception(ex.Message, ex);  
  21.  }  
  22.  finally  
  23.  {  
  24.      conn.Close();  
  25.  }  


3、TransactionScope事务

在.NET 2.0中新添加了一个名为System.Transactions的命名空间,其提供了一个“轻量级”的、易于使用的事务框架,通过这个框架可以大大简化事务的操作。
这个框架提供了如下优点:
(1)在简单(不涉及分布式)事务中也可以使用声明式的事务处理方法,而不必使用Com+容器和目录注册。
(2)用户根本不需要考虑是简单事务还是分布式事务。它实现一种所谓自动提升事务机制(Promotable Transaction),会自动根据事务中涉及的对象资源判断使用何种事务管理器。
TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务

优点:实现简单,同时能够自动提升为分布式事务

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. TransactionOptions option = new TransactionOptions();  
  2. option.IsolationLevel = IsolationLevel.ReadCommitted;  
  3.   
  4. using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,option))  
  5. {  
  6.     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))  
  7.     {  
  8.         conn.Open();  
  9.         SqlCommand cmd = new SqlCommand(conn);  
  10.         cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";  
  11.         cmd.ExecuteNonQuery();  
  12.         cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";  
  13.         cmd.ExecuteNonQuery();  
  14.     }  
  15.     ts.Complete();  
  16. }  
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. TransactionOptions option = new TransactionOptions();  
  2. option.IsolationLevel = IsolationLevel.ReadCommitted;  
  3.   
  4. using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,option))  
  5. {  
  6.     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))  
  7.     {  
  8.         conn.Open();  
  9.         SqlCommand cmd = new SqlCommand(conn);  
  10.         cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试1','1')";  
  11.         cmd.ExecuteNonQuery();  
  12.         cmd.CommandText = "INSERT INTO [Test]([Name],[Value]) VALUES ('测试2','2')";  
  13.         cmd.ExecuteNonQuery();  
  14.     }  
  15.     ts.Complete();  
  16. }  


4、EnterpriseServices实现事务

就是利用com+实现自动处理事务。

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

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

随便建立一个按钮,在按钮中进行如下操作:

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. try    
  2. {    
  3.  work1();    
  4.  work2();    
  5.  ContextUtil.SetComplete();    
  6. }    
  7. catch(System.Exception except)    
  8. {    
  9.  ContextUtil.SetAbort();    
  10.  Response.Write(except.Message);    
  11. }    
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. try    
  2. {    
  3.  work1();    
  4.  work2();    
  5.  ContextUtil.SetComplete();    
  6. }    
  7. catch(System.Exception except)    
  8. {    
  9.  ContextUtil.SetAbort();    
  10.  Response.Write(except.Message);    
  11. }    


然后在页面中添加2个操作,模拟一下在逻辑层调用不同类中的操作的情况 :

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void work1()    
  2.   {    
  3.    SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);    
  4.    SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);    
  5.    conn.Open();    
  6.    cmd1.ExecuteNonQuery();    
  7.    conn.Close();    
  8.   }    
  9.   
  10.   private void work2()    
  11.   {    
  12.    SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);    
  13.    SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(2,'test')",conn);    
  14.    conn.Open();    
  15.    cmd2.ExecuteNonQuery();    
  16.    conn.Close();    
  17.   }    
  18.   
  19. 修改前台页面在<%Page后面添加 Transaction="Required" 即可  
别人转的没有地址。。。。

0 0
原创粉丝点击