asp.net三种方法实现事务
事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下三种总结整理如下:
方法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+事务处理的类必须强命名。
asp.net三种方法实现事务的更多相关文章
- ASP.NET MVC 中将数据从View传递到控制器中的三种方法(表单数据绑定)
		
http://www.cnblogs.com/zyqgold/archive/2010/11/22/1884779.html 在ASP.NET MVC框架中,将视图中的数据传递到控制器中,主要通过发送 ...
 - 【转】asp.net导出数据到Excel的三种方法
		
来源:http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html 原文出处:http://blog.csdn.net/ ...
 - asp.net跳转页面的三种方法比较
		
目前,对于学习asp.net的很多朋友来讲,实现跳转页面的方法还不是很了解.本文将为朋友们介绍利用asp.net跳转页面的三种方法,并对其之间的形式进行比较,希望能够对朋友们有所帮助. ASP.NET ...
 - Asp.Net保存session的三种方法
		
C#中保存Session的三种方法及Web.Config设置 1.保存session到sql server,需要指定Sql Server服务器,这种方法因为要读写数据库最慢 <sessionSt ...
 - ASP.NET对无序列表批量操作的三种方法
		
在网页开发中,经常要用到无序列表.事实上在符合W3C标准的div+css布局中,无序列表被大量使用,ASP.NET虽然内置了BulletedList控件,用于创建和操作无序列表,但感觉不太好用.本篇介 ...
 - Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)
		
1. InProc模式(默认值):asp.net将session保存到当前进程中,这种方式最快,但是不能多台服务器共享session,且会话状态数据容易丢失. <sessionState mod ...
 - C#中??和?分别是什么意思?  在ASP.NET开发中一些单词的标准缩写  C#SESSION丢失问题的解决办法  在C#中INTERFACE与ABSTRACT CLASS的区别  SQL命令语句小技巧  JQUERY判断CHECKBOX是否选中三种方法  JS中!=、==、!==、===的用法和区别  在对象比较中,对象相等和对象一致分别指的是什么?
		
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
 - c#封装DBHelper类  c# 图片加水印  (摘)C#生成随机数的三种方法  使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象  c# 制作正方形图片  JavaScript 事件循环及异步原理(完全指北)
		
c#封装DBHelper类 public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...
 - AJAX实现跨域的三种方法
		
由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问. 比如说你的网站域名是aaa.com,想要通过AJAX请 ...
 
随机推荐
- 201709019工作日记--Java中的各种锁--未解决
			
1. Syncronized与ReentrantLock Synchronized比ReentrantLock进java标准早,因此一开始大家都是用它.相当于Java提供了一种封装的互斥锁机制,对于用 ...
 - (线段树)敌兵布阵--hdu--1166 (入门)
			
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1166 自己第一次在没有看题解AC出来的线段树,写的可能不是太好,再贴个学长的代码,学习一下 发现自己的U ...
 - hdu 5003 模拟水题
			
http://acm.hdu.edu.cn/showproblem.php?pid=5003 记得排序后输出 #include <cstdio> #include <cstring& ...
 - nodejs 获取文件的编码方式
			
使用nodejs获取文件夹内文件的编码方式:使用jschardet模块. 下面的代码还有问题,没有添加结束的语句,没有判断应该在哪执行res.send(). res.send()不能放在forEach ...
 - EBS trace分析
			
下载Trace Analyzer,打开bin下的traceanalyzer.bat 即可分析EBS的trace文件,图形化界面,无需tkprof 需要配置javahome,确认java版本为1.6以上 ...
 - ECG心电图数据2
			
1.如何下载获取MIT-BIH的数据从下面这个官方链接页面可以下载到所有48组MIT-BIH心电数据: http://www.physionet.org/physiobank/database/mit ...
 - Git安全配置
			
今天收到了阿里云异地登录的短信报警,登录阿里云后台发现,有人从深圳登录了我的服务器(本人在北京),查看详细信息一共登录了5次,前两次是使用的git用户进行登录,后两次已经变成了root用户,怀疑是 ...
 - AbpZero之企业微信---登录(拓展第三方auth授权登录)---第二步:开始逐步实现企业微信登录
			
上回分解到AbpZero的auth登录机制,这里我们开始着手逐步实现我们的auth登录. 我们新建一个类库XXXX.Web.Authentication.External 在类库下新建一个类QYWec ...
 - SignalR简单封装
			
需求:Asp.Net MVC 开发客户端,实现与服务器端实时通信. 众所周知,Web开发是基于http的请求响应模型,每次刷新都需要客户端(浏览器)主动发起请求,那么,这个问题怎么解?Asp.Net ...
 - day52 进程与守护进程
			
http://www.cnblogs.com/Eva-J/articles/8253549.html 博客参考. 多进程聊天 守护进程. 多进程 1.Unix/Linux:fork()调用实现多进程. ...