LoveCherry

技术无极限

博客园 首页 新随笔 联系 订阅 管理
  192 Posts :: 0 Stories :: 3239 Comments :: 656 Trackbacks
很多数据库操作需要进行事务,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 on 2005-04-11 10:31 lovecherry 阅读(3764) 评论(11) 编辑 收藏

Feedback

#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+的事务。

 回复 引用 查看   

事务谁都会用啊,如果项目是多层,要兼顾多数据库支持,事务就不知道该用在哪里了
 回复 引用   

#8楼 2008-07-25 13:44 天 天      
请教楼主,我现在想做个方法,最终是使以后我再使用事务的时候,只需设置Transaction="Required"这个属性即可。而不用再做有关的事务方法。还有目前在用Linq。

谢谢。

 回复 引用 查看   

#9楼 2010-07-26 17:59 COOL-CHEN      
楼主,你好我采用你写的第三种方法,给我的程序添加事务,经过测试并不能完成 当程序出现错误后 数据库的数据是不回滚的。
代码是这样的 :上面的引用也是有的,页面也加入Transaction="Required"
try
{
work1("insert into t1(a,b) values(1,2)");
work2("insert into t2(c,d) values(3)"); //本来是要插入两列,但我只传一个参数
ContextUtil.SetComplete();
}
catch(System.Exception except)
{
ContextUtil.SetAbort();
Response.Write(except.Message);
}

 回复 引用 查看