zoukankan      html  css  js  c++  java
  • 使用的Transaction框架

    在  .NET Framework 2.0中增加了System.Transactions,这是一种新的命名空间,完全专
    注于控制事务性行为。引入了执行事务性工作的更简单方法及一些新的性能优化。
    ystem.Transactions提供了一个“轻量级”的、易于使用的Transaction框架。 
    在上节中,要实现Transaction需要利用EnterpriseServices,让组件从 ServiceComponent
    继承下来。 而通过 System.Transactions, 则只要简单的几行代码,不需要继承,不需要 Attribute
    标记。用户根本不需要考虑是简单事务还是分布式事务。新模型会自动根据事务中涉及的对
    象资源判断使用何种事务管理器。简而言之,对于任何的事务,用户只要使用同一种方法进
    行处理即可。 
    下面介绍System.Transactions的几种用法。 
    首先要引用:using System.Transactions;。 
    其次,将事务操作代码放在TransactionScope中执行。如:  
    using  (TransactionScope  ts  =  new  TransactionScope()) 

            //事务操作代码 
            ts.Complete(); 
    } 这是最简单,也是最常见的用法。创建了新的  TransactionScope 对象后,即开始创建事
    务范围。如代码示例所示,建议使用  using  语句创建范围。位于  using  块内的所有操作将
    成为一个事务的一部分,因为它们共享其所定义的事务执行上下文。本例中的最后一行,调
    用  TransactionScope 的  Complete  方法,将导致退出该块时请求提交该事务。此方法还提供
    了内置的错误处理,出现异常时会终止事务。  
                                                         (示例位置:光盘\code\ch05\04\ClassTran\OrderData3) 
    using  (TransactionScope  ts  =  new  TransactionScope())//使整个代码块成为事务性代码 

            #region 在这里编写需要具备Transaction的代码 
            string  msg  =  ""; 
            string  conString  =  "data  source=127.0.0.1;database=codematic;user  id=sa; 
    代码示例:  password="; 
            SqlConnection  myConnection  =  new  SqlConnection(conString); 
            myConnection.Open(); 
            SqlCommand  myCommand  =  new  SqlCommand(); 
            myCommand.Connection  =  myConnection; 
            try 
            { 
                   myCommand.CommandText  =  "update  P_Product  set  Name='电脑2'  where  Id=52"; 
                   myCommand.ExecuteNonQuery(); 
                   myCommand.CommandText  =  "update  P_Product  set  Name='电脑3'  where  Id=53"; 
                   myCommand.ExecuteNonQuery(); 
                   msg  = "成功!"; 
            } 
            catch  (Exception  ex) 
            { 
                   msg  = "失败:"  +  ex.Message; 
            } 
            finally 
            { 
                   myConnection.Close(); 
            } 
            #endregion 
           ts.Complete(); 
            return  msg;                            
    }                      
    上面的代码演示了在一个Transaction Scope里面打开一个数据库连接的过程。这个数据库连接由于处在一个Transaction Scope里面,所以会自动获得 Transaction的能力。如果这里
    数据库连接的是SQL  Server  2005,那么这个 Transaction将不会激活一个 MSDTC管理的分
    布式事务,而是会由.NET创建一个 Local Transaction,性能非常高。但是如果是SQL Server 
    2000,则会自动激活一个分布式事务,在性能上会受一定的损失。 
    再看下面的例子: void  MethodMoreConn() 

            using  (TransactionScope  ts  =  new  TransactionScope()) 
            { 
                   using  (SqlConnection  conn  =  new  SqlConnection(conString1)) 
                   { 
                           conn.Open(); 
                           using  (SqlConnection  conn2  =  new  SqlConnection(conString2)) 
                           { 
                                  conn2.Open(); 
                           } 
                   } 
                   ts.Complete(); 
            }  } 
    这个例子更加充分地说明了 Transaction  Scope 的强大,两个数据库连接!虽然上面的
    conn和conn2是两个不同的连接对象,可能分别连接到不同的数据库,但是由于它们处在一
    个TransactionScope中,它们就具备了“联动”的 Transaction能力。在这里,将自动激活一
    个MSDTC管理的分布式事务(可以通过打开【管理工具】里面的组件服务,来查看当前的
    分布式事务列表) 。 1.在分布式事务中登记 
    ADO.NET  2.0 中的新增功能支持使用  EnlistTransaction  方法在分布式事务中登记。由
    于  EnlistTransaction 在  Transaction 实例中登记连接, 因此, 该方法利用  System.Transactions 
    命名空间中的可用功能来管理分布式事务,从而比使用  System.EnterpriseServices. 
    ITransaction 对象的  EnlistDistributedTransaction 更可取。此外,其语义也稍有不同:在一个
    事务中显式登记了某个连接后,如果第一个事务尚未完成,则无法取消登记或在另一个事务
    中登记该连接。 
    void  MethodEnlist() 

            CommittableTransaction  tx  =  new  CommittableTransaction(); 
            using  (SqlConnection  conn  =  new  SqlConnection(conString)) 
            { 
                   conn.EnlistTransaction(tx); 
            } 
            tx.Commit(); 
    } 2.实现嵌套事务范围 
    void  RootMethod() 

            using  (TransactionScope  scope  =  new  TransactionScope()) 
            { 
                   //操作代码 
                   SonMethod();//子事务方法 
                   scope.Complete(); 
            } 

    void  SonMethod() 

            using  (TransactionScope  scope  =  new  TransactionScope()) 
            { 
                   //操作代码 
                   scope.Complete(); 
            } 
    }

      5  数据库开发
    3.事务范围附加选项 
    如果你想要保留代码部分执行的操作,并且在操作失败的情况下不希望中止环境事务,
    则Suppress对你很有帮助。例如,在你想要执行日志记录或审核操作时,不管你的环境事务
    是提交还是中止,上述值都很有用。该值允许你在事务范围内具有非事务性的代码部分,如
    以下示例所示。 
    void  MethodSuppress() 

            using  (TransactionScope  scope1  =  new  TransactionScope())//开始事务 
            { 
                   try 
                   { 
                           //开始一个非事务范围  
                           using  (TransactionScope  scope2  =  new  TransactionScope( 
          TransactionScopeOption.Suppress)) 
                           { 
                                  //不受事务控制代码 
                           } 
                           //从这里开始又回归事务处理 
                   } 
                   catch 
                   {  }               
            } 
    }

    虽然.NET 2.0 对事务提供了很好的支持,但是没有必要总是使用事务。使用事务的第一
    条规则是,在能够使用事务的时候都应该使用事务,但是不要使用过度。原因在于,每次使
    用事务都会占用一定的开销。另外,事务可能会锁定一些表的行。还有一条规则是,只有当
    操作需要的时候才使用事务。 例如, 如果只是从数据库中查询一些记录, 或者执行单个查询,
    则在大部分时候都不需要使用显式事务。  
    开发人员应该在头脑中始终保持一个概念, 就是用于修改多个不同表数据的冗长事务会
    严重妨碍系统中的所有其他用户。这很可能导致一些性能问题。当实现一个事务时,遵循下
    面的实践经验能够达到可接受的结果: 
    l  避免使用在事务中的Select返回数据,除非语句依赖于返回数据。 
    l  如果使用Select语句,则只选择需要的行,这样不会锁定过多的资源,而尽可能地
    提高性能。 
    l  尽量将事务全部写在T-SQL或者 API中。 
    l  避免事务与多重独立的批处理工作结合,应该将这些批处理放置在单独的事务中。  
    l  尽可能避免大量更新。  
    另外,必须注意的一点就是事务的默认行为。在默认情况下, 如果没有显式地提交事务,
    则事务会回滚。 虽然默认行为允许事务的回滚, 但是显式回滚方法总是一个良好的编程习惯。
    这不仅仅只是释放锁定数据,也将使得代码更容易读取并且更少错误。

  • 相关阅读:
    linux 修改 properties
    用Python串口实时显示数据并绘图pyqtgraph
    Python pip国内源
    设计模式之享元模式
    阿里云数据库李飞飞:云计算推动数据库向云原生快速演进
    不懂代码,他怎么开发了20多个政务应用?
    2021十大科技趋势来了!阿里巴巴达摩院全新发布
    2020年勒索病毒事件盘点及未来发展趋势
    一文详解 Nacos 高可用特性
    “让专业的人做专业的事”,畅捷通与阿里云的云原生故事 | 云原生 Talk
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1979739.html
Copyright © 2011-2022 走看看