在web开发中的三个层次使用事务(C#编程)

转:

在web开发中的三个层次使用事务(C#编程)

很多数据库操作需要进行事务,Asp.net下面进行事务大致有3个层次:  
(1)存储过程层次的事务  
(2)Ado.Net层次的事务  
(3)Asp.Net页面层次的事务  
下面分别举例:  
首先建立trantest表,字段id(int),test(char)  
为id设置主键(利用主键是不允许重复的特性进行事务测试)  
假设数据库内存在记录id=1,test='test'
(1)
  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)
  1. SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);  
  2. SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);  
  3. SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);  
  4. conn.Open();  
  5. SqlTransaction tran=conn.BeginTransaction();  
  6. cmd1.Transaction=tran;  
  7. cmd2.Transaction=tran;  
  8. try  
  9. {  
  10. cmd1.ExecuteNonQuery();  
  11. cmd2.ExecuteNonQuery();  
  12. tran.Commit();  
  13. }  
  14. catch(SqlException except)  
  15. {  
  16. tran.Rollback();  
  17. Response.Write(except.Message);  
  18. }  
  19. finally  
  20. {  
  21. conn.Close();  
  22. }  
复制代码
(3)  
添加引用System.EnterpriseServices.dll  
[code]using System.EnterpriseServices;  

随便建立一个按钮,在按钮中进行如下操作:
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();  
  }  [/code
]修改前台页面在<%Page后面添加 Transaction="Required" 即可
以上是我个人在实际工作中总结的一些经验,好不好还需要大家的评论了,其中如有不足的地方,还希望大家能帮我指出.

作者: 听老歌   发布时间: 2011-06-10

三种层次的,数据库级别的,代码级别的.COM级别的.
我最常用还是数据库级别的

作者: apmw7747   发布时间: 2011-06-12