• TransactionScope


    转自:http://blog.csdn.net/wyxhd2008/article/details/7958423

    一、概念

    1、在项目中引用using System.Transactions命名空间(先要在添加net组件的引用);

    TransactionScope有三种模式:

    TransactionScopeOptions

    描述

    Required

    如果已经存在一个事务,那么这个事务范围将加入已有的事务。否则,它将创建自己的事务。

    RequiresNew

    这个事务范围将创建自己的事务。

    Suppress

    如果处于当前活动事务范围内,那么这个事务范围既不会加入氛围事务 (ambient transaction),也不会创建自己的事务。当部分代码需要留在事务外部时,可以使用该选项。

    进入和退出事务都要快,这一点非常重要,因为事务会锁定宝贵的资源。最佳实践要求我们在需要使用事务之前再去创建它,在需要对其执行命令前迅速打开连接, 执行动作查询 (Action Query),并尽可能快地完成和释放事务。在事务执行期间,您还应该避免执行任何不必要的、与数据库无关的代码,这能够防止资源被毫无疑义地锁定过长的 时间。

     

    2、代码例子:

     TransactionOptions transactionOption = new TransactionOptions();

                
    //设置事务隔离级别
                transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;

                
    // 设置事务超时时间为60秒
                transactionOption.Timeout = new TimeSpan(0060);

                
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
                
    {
                    
    try
                    
    {
                        
    //在这里实现事务性工作
         
    //发送消息
                        insertMessage(sendUserId, toUser, content, sendedStatus);

         
    //在接收信息表中插入记录
                        receiveCount += insertReceiveMessage(userids[0], sendUserId, content, "0");
                       
                        
    // 没有错误,提交事务
                        scope.Complete();
                    }

                    
    catch (Exception ex) {
                        
    throw new Exception("发送信息异常,原因:"+ex.Message);
                    }finally{
                        //释放资源
                        scope.Dispose();
                      }
                                   
                }

    3、在TransactionScope中默认的事务级别是Serializable,即在事务过程中,完全性锁表。别的进程不能查询,修改,新增,删除。这样会导致效率大大降低,虽然数据完整性很高。通常我们不需要那么高的数据完整性。所以需要修改默认的事务级别:

          所有的事务级别如下:

    成员名称 说明 
     Chaos                         无法改写隔离级别更高的事务中的挂起的更改。  
     ReadCommitted       不可以在事务期间读取可变数据,但是可以修改它。  
     ReadUncommitted    可以在事务期间读取和修改可变数据。  
     RepeatableRead       可以在事务期间读取可变数据,但是不可以修改。可以在事务期间添加新数据。  
     Serializable                可以在事务期间读取可变数据,但是不可以修改,也不可以添加任何新数据。  
     Snapshot                   可以读取可变数据。在事务修改数据之前,它验证在它最初读取数据之后另一个事务是否更改过这些数据。如果数据已被更新,则会引发错误。这样使事务可获取先前提交的数据值。 
    在尝试提升以此隔离级别创建的事务时,将引发一个 InvalidOperationException,并产生错误信息“Transactions with IsolationLevel Snapshot cannot be promoted”(无法提升具有 IsolationLevel 快照的事务)。
     
     Unspecified                正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。如果设置了此值,则会引发异常。  

    二、与数据库事务结合

    //创建TransactionScope
    wps_clip_image-8386using (TransactionScope tsCope= new TransactionScope())
    wps_clip_image-10230wps_clip_image-16703{
    wps_clip_image-12198 using (SqlConnection cn2005= new SqlConnection(someSql2005))
    wps_clip_image-8414wps_clip_image-5728 {
    wps_clip_image-7947 SqlCommand cmd= new SqlCommand(sqlUpdate, cn2005);
    wps_clip_image-15199 cn2005.Open();
    wps_clip_image-11670 cmd.ExecuteNonQuery();
    wps_clip_image-716 }
    wps_clip_image-15176 using (SqlConnection cn2005= new SqlConnection(anotherSql2005))
    wps_clip_image-30312wps_clip_image-12410 {
    wps_clip_image-13405 SqlCommand cmd= new SqlCommand(sqlDelete, cn2005);
    wps_clip_image-29978 cn2005.Open();
    wps_clip_image-26021 cmd.ExecuteNonQuery();
    wps_clip_image-29682 }
    wps_clip_image-175
    wps_clip_image-27966 tsCope.Complete();
    wps_clip_image-554}

    三、与WCF事务结合

  • 相关阅读:
    Linux权限对文件或者目录的影响
    Linux基础命令chmod(什么是权限?如何设置权限)
    Shell编程——素数的判断
    Shell编程——阶乘
    Shell编程——回文数
    汇编(8253计数器)
    汇编(8255A的工作方式1)
    汇编(8255A的方式0)
    汇编(程序查询方式控制输入输出)
    Shell函数、接受用户输入
  • 原文地址:https://www.cnblogs.com/yeagen/p/3021468.html
Copyright © 2020-2023  润新知