(原创)在web开发中的三个层次使用事务

很多数据库操作需要进行事务,Asp.net下面进行事务大致有3个层次: 
(1)存储过程层次的事务 
(2)Ado.Net层次的事务 
(3)Asp.Net页面层次的事务 
下面分别举例: 
首先建立trantest表,字段id(int),test(char) 
为id设置主键(利用主键是不允许重复的特性进行事务测试) 
假设数据库内存在记录id=1,test='test'
(1) 
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) 
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]); 
SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn); 
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn); 
conn.Open(); 
SqlTransaction tran=conn.BeginTransaction(); 
cmd1.Transaction=tran; 
cmd2.Transaction=tran; 
try 

 cmd1.ExecuteNonQuery(); 
 cmd2.ExecuteNonQuery(); 
 tran.Commit(); 

catch(SqlException except) 

 tran.Rollback(); 
 Response.Write(except.Message); 

finally 

 conn.Close(); 


(3) 
添加引用System.EnterpriseServices.dll 
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(); 
  } 

修改前台页面在<%Page后面添加 Transaction="Required" 即可
posted @ 2005-04-11 10:31 lovecherry 阅读(3445) 评论(10)  编辑 收藏 网摘 所属分类: webform

  回复  引用  查看    
#1楼2005-04-11 11:25 | ttyp      
总结的很好
  回复  引用  查看    
#2楼2005-04-11 14:08 | 林和少      
第3种方法没用过,不知道好不好使。

  回复  引用  查看    
#3楼2007-05-29 17:02 | 钱彦云      
第三种方法很有意思,收藏一下
  回复  引用    
#4楼2007-07-15 18:58 | netx[未注册用户]
第三个用的是 COM+的事务处理
  回复  引用  查看    
#5楼2008-03-06 09:49 | John Rambo      
Thank you,see the big image.
  回复  引用  查看    
#6楼2008-04-22 14:49 | ColdDog      
有没有推荐一下哪种方式比较可取?
个人觉得第二种方式好理解也一直采用这种方式。
至于Com+的事务,我现在工作的程序(别人以前写的),就是Com+的事务。

  回复  引用    
#7楼2008-05-06 16:35 | 私家侦探1[未注册用户]
事务谁都会用啊,如果项目是多层,要兼顾多数据库支持,事务就不知道该用在哪里了
  回复  引用  查看    
#8楼2008-07-25 13:44 | 天 天      
请教楼主,我现在想做个方法,最终是使以后我再使用事务的时候,只需设置Transaction="Required"这个属性即可。而不用再做有关的事务方法。还有目前在用Linq。

谢谢。




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 135365




相关文章:

相关链接: