事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下三种总结整理如下:
方法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+事务处理的类必须强命名。

SqlServer_事务的更多相关文章

  1. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  2. SQLServer事务同步下如何收缩日志

    事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...

  3. 事务日志已满,原因为“ACTIVE_TRANSACTION”

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 异常处理汇总-数据库系列  http://www.cnblogs.com/dunitia ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  6. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  8. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  9. PHP中PDO事务的使用方法

    事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...

随机推荐

  1. Check the difficulty of problems

    Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5830 Acc ...

  2. JAVA基础知识之多线程——线程的生命周期(状态)

    线程有五个状态,分别是新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead). 新建和就绪 程序使用new会新建一个线程,new出的对象跟普通对象一 ...

  3. 通过PowerShell查看Android端log信息

    在Windows下我们可以通过在cmd中输入adb logcat相关命令来查看安卓设备上的log信息,这在PowerShell里也可以做到.所以方便做成一个脚本,以便复用.代码如下: function ...

  4. 2016年11月25日 星期五 --出埃及记 Exodus 20:16

    2016年11月25日 星期五 --出埃及记 Exodus 20:16 "You shall not give false testimony against your neighbor.不 ...

  5. 解决discuz论坛搬家:“Table ‘common_syscache’ is read only”问题

    解决discuz论坛搬家:“Table ‘common_syscache’ is re http://www.zixuephp.com/wzht/discuz/20141203_11562.html ...

  6. MyBatis的返回参数类型和查询结果遍历

    MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1.resultMap: 1.2.resultType: 2 .对应返回值类型: 2.1.resultMap:结果集 2.2.result ...

  7. AES加密算法-128位高安全,高速度

    网上资料显示,下一代加密技术会围绕着AES技术进行.初出茅庐,学习编写了加密代码,如下所示 package com.bao.tools.encryption; import java.security ...

  8. Eclipse中没有andriod问题解决方法

    按照网上教程<andriod+环境搭建_图文版>进行安装android,结果,在eclipse中window->preference下找不到"Android"选项 ...

  9. 【翻译】Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解)

    [翻译]Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解) . . .

  10. XML学习笔记(二)-- DTD格式规范

    标签(空格分隔): 学习笔记 XML的一个主要目的是允许应用程序之间自由交换结构化的数据,因此要求XML文档具有一致的结构.业务逻辑和规则.可以定义一种模式来定义XML文档的结构,并借此验证XML文档 ...