很多数据库操作需要进行事务,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

转载于:https://www.cnblogs.com/chenbg2001/archive/2010/04/22/1717951.html

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

  1. ASP.NET2.0数据操作之创建业务逻辑层

    导言 本教程的第一节所描述的数据访问层(Data Access Layer,以下简称为DAL)已经清晰地将表示逻辑与数据访问逻辑区分开了.不过,即使DAL将数据访问的细节从表示层中分离出来了,可它却不 ...

  2. ASP.NET三层数据操作与GridView互动

    注册用户?管理用户? 练习一个面向对象的ASP.NET练习.以下博文是很基础很基础,适合刚接触ASP.NET参考. 在数据库,创建一个表[Member],用来存储用户注册的信息. View Code ...

  3. 三、Hive数据仓库应用之Hive数据操作语言(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)

    Hive远程模式部署参考: 一.Hive数据仓库应用之Hive部署(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7) Hive数据定义语言 ...

  4. ASP.NET2.0数据操作之创建数据访问层(3)

    第四步:插入,更新和删除数据 常用的插入,更新和删除数据的模式有两种.第一种模式,我称之为DB直接模式,涉及的方法被调用时,会向数据库里发出一个INSERT, 或UPDATE,或DELETE命令,这个 ...

  5. ASP.NET2.0数据操作之母板页和站点导航

    http://www.anqn.com/aspx/2009-06-21/a09111817.shtml

  6. 沈向洋、华刚:读科研论文的三个层次、四个阶段与十个问题

    来源:微软学术合作 本文约6000字,建议阅读8分钟. 阅读文章不仅是大家在科研道路上进步的必由之路,也能使我们的心智不断成长,认知模型和思维方式不断完善. 沈向洋博士:如何以正确方式打开一篇科研论文 ...

  7. [转载]商业智能的三个层次

    注:此文转载自http://www.minesage.com/html/index_8_202.html 这篇文章用很简单的语言描述了BI相关的技术和概念,之所以转载他,是因为在所有的文章当中,这一篇 ...

  8. mysql三个层次_数据库的基本结构三个层次

    数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合.这种数据集合具有如下特点:尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序,对数据的增.删.改和检索 ...

  9. 数字图像处理的三个层次

    数字图像处理分为三个层次:低级图像处理.中级图像处理和高级图像处理(狭义图像处理.图像分析和图像理解). 狭义图像处理:对输入图像进行某种变换得到输出图像,是一种图像到图像的过程. (1)低级图像处理 ...

最新文章

  1. python发声-python写报警程序中的声音实现winsound
  2. 理解 Go defer
  3. 剑指Offer:包含main函数的栈(借助辅助栈)
  4. java 大数据处理之内存溢出解决办法(一)
  5. 乐高(LEGO)在线购物店面剖析
  6. 使用计算机时 开关机顺序会,电脑如何正确开关机
  7. 周末之个人杂想(四)
  8. 一文说透WordPress的自定义文章类型
  9. 趣说cpu指令集之别
  10. [索引汇总帖] 【eoeAndroid社区索引】Cocos2d-x部分汇总 [转贴]
  11. pdf阅读器怎么样去拆分文档啊
  12. 机器视觉学习笔记(6)——双目摄像机标定参数说明
  13. sagemath matlab,sagemath 是否真的好用?还是隐藏了大坑?
  14. vm怎么上传镜像文件到服务器,vmware怎么添加iso镜像文件-vmware添加iso镜像文件的方法 - 河东软件园...
  15. 微信公众号实现淘宝查券机器人
  16. k3d入门指南:在Docker中运行K3s
  17. 2003服务器系统打开iis,windows2003服务器iis网站安全设置图解linux操作系统 -电脑资料...
  18. 笨笨豆 - 移动互联网时代微信分享营销
  19. Android音视频API - MediaCodec/MediaMuxer/MediaStore/MediaController等
  20. K3s+Jetson Nano,在边缘端实现实时视频分析!

热门文章

  1. 4核处理器_买电脑选4核、6核还是8核,从业是十年的专家终于讲清楚了差异
  2. linux进程被杀掉日志,Linux进程突然被杀掉(OOM killer),查看系统日志
  3. span标签的鼠标滑入提示_彻底搞懂拖拽——基于鼠标事件的拖拽以及基于HTML5 API的拖拽...
  4. wincc上位机与1200组态步骤_组态上位机WINCC与PLC通讯连接
  5. java对接支付宝微信银联_经典设计模式之策略模式【如何重构聚合支付平台,对接【支付宝,微信,银联支付】】(示例代码)...
  6. php实现关键字搜索mysql数据_PHP实现多个关键词搜索查询功能示例
  7. eclipse插件开发(四) 流程图绘制插件(雏形)
  8. php现实的九九乘法,php趣味编程 - php 输出九九乘法
  9. win7 java jna找不到_java – 资源路径中找不到JNA本机支持(/com/sun/jna/linux-arm/libjnidispatch.so)...
  10. java语言用数组接收字符_Java基础——数组应用之字符串String类