事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下三种总结整理如下:
方法1:直接写入到sql 中
在存储过程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 实现
begin trans
declare @orderDetailsError int,@procuntError int
delete from [order details] where productid=42
select @orderDetailsError =@@error
delete from products where productid=42
select @procuntError=@@error
if(@orderDetailsError =0 and @procuntError=0)
COMMIT TRANS
else
ROLLBACK TRANS
优点:
    所有事务逻辑包含在一个单独的调用中
    拥有运行一个事务的最佳性能
    独立于应用程序
限制:
    事务上下文仅存在于数据库调用中
    数据库代码与数据库系统有关
方法2 :使用ADO.Net 实现
使用ADO.Net 实现,使用这种方式的优点是可以在中间层来管理事务,当然你也可以选择在数据层来实现。
SqlConnection 和OleDbConnection    对象有一个 BeginTransaction 方法,它可以返回 SqlTransaction
或者OleDbTransaction 对象。而且这个对象有 Commit 和 Rollback 方法来管理事务
     SqlConnection sqlConnection = new SqlConnection("workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False");
     sqlConnection.Open();
     SqlTransaction    myTrans = sqlConnection.BeginTransaction();
     SqlCommand sqlInsertCommand = new SqlCommand();
     sqlInsertCommand.Connection = sqlConnection
     sqlInsertCommand.Transaction=myTrans;
     try{
         sqlInsertCommand.CommandText="insert into tbTree(Context,ParentID) values('北京',1)";
         sqlInsertCommand.ExecuteNonQuery();
         sqlInsertCommand.CommandText="insert into tbTree(Context,ParentID) values('上海',1)";
         sqlInsertCommand.ExecuteNonQuery();
         myTrans.Commit();
       }catch(Exception ex)
       {
        myTrans.Rollback();
       }
      finally
      {
       sqlConnection.Close();
      }
优点:
       简单性
       和数据据事务差不多的快
       独立于数据库,不同数据库的专有代码被隐藏了
缺点:
       事务不能跨越多个数据库连接
       事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接
       ADO.Net分布事务也可以跨越多个数据库,但是其中一个SQL SERVER 数据库的话,通过用SQL SERVER连接服务器连接到别的数据库,但是如果是在DB2和Orcal之间就不可以。
以上两种事务是经常用到的事务处理方法。
方法3    COM+事务(分布式事务)
.Net Framework 依靠 MTS/COM+ 服务来支持自动事务。COM+ 使用 Microsoft Distributed Transaction Coordinator (DTC) 作为事务管理器和事务协调器在分布式环境中运行事务。
这样可使 .Net 应用程序运行跨多个资源结合不同操作(例如,将定单插入 SQL Server 数据库、将消息写入 Microsoft 消息队列 (MSMQ) 队列、以及从 Oracle 数据库检索数据)
的事务。
     COM+事务处理的类必须继承System.EnterpriseServices.ServicedComponent,其实web service就是继承System.EnterpriseServices.ServicedComponent,所以web service也支持
COM+事务。
     定义一个COM+事务处理的类
          [Transaction(TransactionOption.Required)]
public class DataAccess:System.EnterpriseServices.ServicedComponent
{

}
TransactionOption枚举类型支持5个COM+值(Disabled,NotSupported,Required,RequiresNew,Supported)
Disabled        忽略当前上下文中的任何事务。
NotSupported    使用非受控事务在上下文中创建组件。
Required        如果事务存在则共享事务,并且如有必要则创建新事务。
RequiresNew     使用新事务创建组件,而与当前上下文的状态无关。
Supported       如果事务存在,则共享该事务。
一般来说COM+中的组件需要Required 或Supported。当组件用于记录或查帐时RequiresNew 很有用,因为组件应该与活动中其他事务处理的提交或回滚隔离开来。
派生类可以重载基类的任意属性。如DataAccess选用Required,派生类仍然可以重载并指定RequiresNew或其他值。

COM+事务有手动处理和自动处理,自动处理就是在所需要自动处理的方法前加上[AutoComplete],根据方法的正常或抛出异常决定提交或回滚。
手动处理就是调用ContextUtil类中EnableCommit,SetComplete,SetAbort方法。
              public string    testTransaction()
    {
     try
     {
      ContextUtil.EnableCommit();
      InsertARecord1();
      InsertARecord2();
                                  ContextUtil.SetComplete();
      return "succeed!";
     }
     catch(Exception ex)
     {
      ContextUtil.SetAbort();
             return "failed!";
     }

}
               public void InsertARecord1()
    {
   
      string strconn="workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False";
      SqlConnection conn=new SqlConnection(strconn);
      conn.Open();
      SqlCommand command=new SqlCommand("insert into tbTree(Context,ParentID) values('北京',1)",conn);
      command.ExecuteNonQuery();
      conn.Close();         
     
    }
                public void InsertARecord2()
    {
   
      string strconn="workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False";
      SqlConnection conn=new SqlConnection(strconn);
      conn.Open();
      SqlCommand command=new SqlCommand("insert into tbTree(Context,ParentID) values('上海',1)",conn);
      command.ExecuteNonQuery();
      conn.Close();     
    }
在需要事务跨 MSMQ 和其他可识别事务的资源(例如,SQL Server 数据库)运行的系统中,只能使用 DTC 或 COM+ 事务,除此之外没有其他选择。DTC 协调参与分布式事务的所有资源管理器,
    也管理与事务相关的操作。
这种做法的缺点是,由于存在 DTC 和 COM 互操作性开销,导致性能降低。
COM+事务处理的类必须强命名。

转载于:https://www.cnblogs.com/kedarui/p/3621180.html

asp.net三种方法实现事务相关推荐

  1. asp.net html 加密解密,三种方法还原ASP.NET可逆加密内容

    0x00 在进行安全测试的时候经常遇到ASP.NET平台的各类系统,它们加密手段有强有弱.有的只加密用户信息,有的则将数据库连接字串也进行了加密.以前不熟悉ASP.NET的时候有时解密一个连接字串都要 ...

  2. asp.net服务器端跳转页面的三种方法

    asp.net服务器端跳转页面的三种方法 1.Response.Redirect这个跳转页面的方法跳转速度不快,因为它要走2次回发(postback). 它可以跳转到任何页面,没有站点页面限制(可以由 ...

  3. [转]asp.net导出数据到Excel的三种方法

    原文出处:asp.net导出数据到Excel的几种方法(1/3) .asp.net导出数据到Excel的几种方法(2/3).asp.net导出数据到Excel的几种方法(3/3) asp.net导出到 ...

  4. asp.net错误处理的三种方法

    asp.net错误处理的三种方法 以前有过一篇博文,主要是出错时调至错误页面,然后将当前出错的页面存入Session,然后执行刷新等操作,该机制主要用于 程序员自己控制错误,但是有些错误和异常是程序员 ...

  5. 在GridView里做单选按钮,总结了三种方法

    在GridView里做单选按钮,总结了三种方法 第一种方法:在GridView的模版列里加服务器端控件RadioButton,使用js控制单选 <p>使用模版列里加RadioButton& ...

  6. mysql改存储引擎教程_MySQL中修改数据表存储引擎的三种方法

    第一种方法:ALTER TABLE 将表从一个引擎修改为另一个引擎最简单的办法是使用ALTER TABLE语句,转换表的存储引擎会导致失去原引擎相关的所有特性. 例:将mytable的引擎修改为Inn ...

  7. 安装软件包的三种方法 ,rpm包介绍 , rpm工具用法, yum工具用法, yum搭建本地仓库...

    linux安装和卸载软件 安装三种方法 rpm工具 yum工具 源码包 rpm工具使用 首先看一下什么事rpm包,可以挂载光驱看看里面有很多 [root@localhost ~]# mount /de ...

  8. mysql添加临时索引_mysql 中添加索引的三种方法

    在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以通过不同的应用场景来进行索引的新建,在此列出三种新建索引的方法 mysql 中添加索引的三种方法 1.1 新建表中添加索 ...

  9. 三种方法构建简单的WEB服务器!

    <Essential ASP.NET 本质论>举例了Socket编程的基本知识,我稍加修改弄了个简单的应用. 你可以将生成的EXE文件拷贝到服务器上,这样通过任意的WEB浏览器都可以获得该 ...

最新文章

  1. hnswlib RuntimeError: Cannot return the results in a contigious 2D array. Probably ef or M is to sma
  2. html中内联元素和块元素的区别、用法以及联系
  3. JMessage Android 端开发详解
  4. 如何判断当前主机是物理机还是虚拟机
  5. HTML全面深入学习-select的optgroup分组
  6. Android向本地写入一个XML文件和解析XML文件
  7. cuda7.0安装(嵌入式)
  8. frontend-maven-plugin插件问题解决
  9. php上老师查看作业,请老师查阅俺的作业效果,看还满意不
  10. java day44【JQuery 基础:概念,快速入门,JQuery对象和JS对象区别与转换,选择器,DOM操作,案例】...
  11. 智能合约漏洞,公链的阿喀琉斯之踵
  12. grunt_从Grunt测试Grunt插件
  13. 哈尔滨计算机管理,哈尔滨戴斯酒店计算机管理系统.doc
  14. [RK3399/RK3328][Android10.0] storage:u盘/移动硬盘 每次开机都提示需要格式化
  15. 踩坑 微信小程序开发mpvue使用iconfont,顺便解决偶现图标显示不正确
  16. 9.27通则康威技术面
  17. 在线社交网络影响力分析——总结
  18. 时间轮(TimeWheel)的设计与实现
  19. 在进行多媒体计算机辅助教学,计算机多媒体辅助在数学教学中的应用
  20. X线DR医学图像 --- DR医用滤线栅及摩尔纹详解 (六) 金字塔+傅里叶滤波

热门文章

  1. Vlan配置详解之三层交换
  2. python 如何调用另一个路径下py文件的函数
  3. L2-039 清点代码库 (25 分)-PAT 团体程序设计天梯赛 GPLT
  4. [Java] 蓝桥杯ALGO-64 算法训练 大小写判断
  5. [Python] L1-019. 谁先倒-PAT团体程序设计天梯赛GPLT
  6. 蓝桥杯 BASIC-25 基础练习 回形取数
  7. 蓝桥杯 ADV-66算法提高 阮小二买彩票
  8. 【操作系统】进程的异步性
  9. 小程序Windows和linux,改进后的《自动显示天气预报》小程序(Linux和Windows环境都可以)...
  10. oracle shutdown 默认,oracle shutdown 没有反应