在三个层次对Asp.Net的数据操作进行事务

发布时间: 2007-01-24 11:37    作者: 未知    来源: 未知    浏览:    评论


很多数据库操作需要进行事务,Asp.net下面进行事务大致有3个层次:
(1)存储过程层次的事务
(2)Ado.Net层次的事务
(3)Asp.Net页面层次的事务
下面分别举例:
首先建立trantest表,字段id(int),test(char)
为id设置主键(利用主键是不允许重复的特性进行事务测试)

(1)
CREATE PROCEDURE Tran1
as
begin tran
Insert Into trantest (id,test)values(1,'test')
Insert Into trantest (id,test)values(1,'test')
if(@@error=0)
commit tran
else
rollback tran
GO
运行这个存储过程可以发现一条记录都没有,说明的确是回滚了
清空数据库的记录,修改一下这个存储过程
CREATE PROCEDURE Tran1
as
begin tran
Insert Into trantest (id,test)values(1,'test')
Insert Into trantest (id,test)values(2,'test')
if(@@error=0)
commit tran
else
rollback tran
GO
运行这个存储过程可以发现添加了2条记录,说明的确是提交了事务
清空数据库的记录

(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();
}
同样运行的结果是什么记录都没有添加,清空后再修改为
SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(2,'test')",conn);
运行后数据库内有2条记录

(3)
添加引用System.EnterpriseServices.dll
using System.EnterpriseServices;

ServiceConfig config = new ServiceConfig();
config.Transaction = TransactionOption.Required;
ServiceDomain.Enter(config);
try
{
 work1();
 work2();
 ContextUtil.SetComplete();
}
catch(System.Exception except)
{
 ContextUtil.SetAbort();
 Response.Write(except.Message);
}
finally
{
 ServiceDomain.Leave();
}

然后在页面中添加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(1,'test')",conn);
   conn.Open();
   cmd2.ExecuteNonQuery();
   conn.Close();
  }

清空数据库后运行后发现的确是没有写入任何记录,再次清空数据库,修改一下work2()
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(2,'test')",conn);运行后发现添加了2条记录。

说明2点:
1、
ServiceConfig config = new ServiceConfig(); 
config.Transaction = TransactionOption.Required; 
ServiceDomain.Enter(config);
到最后的ServiceDomain.Leave(); 表示
在这段中进行了事务,如果要简单的为整个页面进行事务,修改如下
try
{
    work1();
    work2();
    ContextUtil.SetComplete();

}
catch(System.Exception except)
{
    ContextUtil.SetAbort();
    Response.Write(except.Message);
}
这样就可以了,还有别忘记在前台的Page中加上
Transaction="Required"
2、不要在work1()、work2()中再添加try{}catch{}代码块了
3、因为我的机器是xp sp2,没有注意到这个问题,经思归大哥提醒,恍然大悟,补充一点,有平台限制,只能在windos2003或者xp xp2中运用,否则会给出"当前平台上不支持“ServiceConfig”的异常信息,等有机会自己再测试一下。要在xp sp1中使用可以下载补丁,参考:
http://www.alexthissen.nl/Weblog/PermaLink.aspx?Guid=f6d61461-d336-40b0-9f4d-51eab6650f27
http://www.rm.com/Support/GeneralDownload.asp?cref=DWN222592&nav=0

TAG

Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多