最近发现微软自带的TransactionScope(.Net Framework 2之后)是个好东东,提供的功能也很强大。

  首先说说TransactionScope是什么,并能为我们做什么事情。其实看Transaction(事务)这个单词,我想大家已经能猜到个大概。不同于SqlTransaction的事务,因为现在做的项目都有不同的分层架构,如果不在数据库操作层里面做的话,那么使用TransactionScope是一种理想的方式,它是一个轻量级的事务类。所谓事务,就好比两个串联的开关,控制着一个灯泡,这两个开关可以理解为一个独立的单位,要么都开,否则灯泡就亮不起来。在程序里面就是要么都正常执行,如果中间有异常,事务就会出现回滚操作。回滚操作相当于回到操作之前的状态,可以理解为没有操作。这里面,事务是针对数据库的一种行为。

  要想使用TransactionScope,很方便,只需要在项目中添加System.Transactions.dll引用,然后添加命名空间(using System.Transactions;)即可。

  我们来看看微软的TransactionScope类:

public sealed class TransactionScope : IDisposable
    {
        public TransactionScope();
        public TransactionScope(Transaction transactionToUse);
        public TransactionScope(TransactionScopeOption scopeOption);
        public TransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout);
        public TransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeout);
        public TransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions);
        public TransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout, EnterpriseServicesInteropOption interopOption);
        public TransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions, EnterpriseServicesInteropOption interopOption);

public void Complete();
        public void Dispose();
    }

  sealed关键字修饰类,说明该类不能被继承。该类提供多种构造函数及Complete()和Dispose()方法.

  =》Complete()即为提交事件的方法

  =》Dispose()即释放事务对象的方法

  (1)TransactionScopeOption参数,该参数是一个枚举类型:

public enum TransactionScopeOption
    {

   Required = 0,
   RequiresNew = 1,
   Suppress = 2
    }

  Required=》该范围需要一个事务。 如果已经存在事务,则使用该事务。

        否则,在进入范围之前创建新的事务。 这是默认值。

  RequiresNew=》总是为该范围创建新事务

  Suppress=》事务上下文在创建范围时被取消。 范围中的所有操作都在无事务上下文的情况下完成。

  通过查看 System.Transactions.Transaction.Current 属性。如果这个属性为“null”,说明不存在当前事务。

  (2)TransactionOptions参数,包含指定事务行为的附加信息。

 public struct TransactionOptions
    {

    。。。。。。

public IsolationLevel IsolationLevel { get; set; }
        public TimeSpan Timeout { get; set; }
    }

  如果要修改 TransactionScope 的默认设置,可以实例化TransactionOptions对象,并对该对象传递需要的参数。可以通过它在 TransactionScope 对象上设置隔离级别和事务的超时时间。

  IsolationLevel=》设置隔离级别

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

  Timeout=》设置事务的超时时间(默认设置为 1 分钟)

TimeSpan(Int64)                                        将新的 TimeSpan 初始化为指定的刻度数。 
 TimeSpan(Int32, Int32, Int32)                     将新的 TimeSpan 初始化为指定的小时数、分钟数和秒数。 
 TimeSpan(Int32, Int32, Int32, Int32)            将新的 TimeSpan 初始化为指定的天数、小时数、分钟数和秒数。 
 TimeSpan(Int32, Int32, Int32, Int32, Int32)   将新的 TimeSpan 初始化为指定的天数、小时数、分钟数、秒数和毫秒数。

  (3)下面举一个例子说明怎么使用,主要看红色部分的代码,红色部分代码即为使用TransactionScope的例子。用很少的几行代码就可以实现轻量级TransactionScope事务。

public void FixProjectSorceInsert()
        {
            TransactionOptions transactionOption = new TransactionOptions();
            //设置事务隔离级别
            transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
            // 设置事务超时时间为120秒
            transactionOption.Timeout = new TimeSpan(0, 0, 120);

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
            {
                try
                {
                    Insert();

Update();

Delete();

// 没有错误,提交事务
                    scope.Complete();
                }
                catch (Exception ex)
                {
                    throw new Exception("发送信息异常,原因:" + ex.Message);
                }
                finally
                {
                    //释放资源
                    scope.Dispose();
                }

}
        }

  (4)小结:使用事务,就像使用一把锁,会锁定资源。资源总是有限,所以进入和退出事务都要控制在较短的时间。在需要使用事务前创建它,在需要执行时打开连接,并尽快完成释放事务。而且在事务执行中,尽可能避免执行不必要或与数据库操作无关的代码,因为这能够防止资源被过度锁定。

  

转载于:https://www.cnblogs.com/huangyangblogs/p/3305602.html

TransactionScope相关推荐

  1. 基于TransactionScope类的分布式隐式事务

    System.Transactions 命名空间中除了上一节中提到的基于 Transaction 类的显式编程模型,还提供使用 TransactionScope 类的隐式编程模型,它与显示编程模型相比 ...

  2. transactionscope 中的异步 处理 异常_.NET Core中TransactionScope事务处理方法介绍及注意事项...

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.html 今天在写CzarCms的UnitOfWork的使用使用到了这个Transacti ...

  3. 应用 TransactionScope 报:此操作对该状态的事务无效 的错误

    如果在事务过程跨了数据库服务器(即使在同一台服务器上,两个不同的数据库实例也算跨数据库服务器),而使用 TransactionScope 却报:此操作对该状态的事务无效 的错误 是因为没有启用每台服务 ...

  4. sql中的Tran和C#中的TransactionScope介绍

    sql 中的Tran 俩种写法 第一种写法 try catch: Begin TRYBegin Tran transactionDECLARE @ServiceOrderId INT SET @Ser ...

  5. TransactionScope 的基本原理简介

    C# 的事务编程 1 Db事务 DbConnection 中创建基于当前连接的 DbTransaction 2  使用TransactionScope ,创建环境事务 一旦创建,在这个环境包含的DbC ...

  6. 关于TransactionScope分布式事务在Oracle下的运作

    .Net 2.0下的TransactionScope分布式事务一直在项目中很好地使用着(Sql Server),最近由于数据库改换了Oracle 10g,出现了一个问题,就是TransactionSc ...

  7. 将不确定变为确定~transactionscope何时提升为分布式事务?

    相关文章 将不确定变为确定~transactionscope何时提升为分布式事务 将不确定变为确定~transactionscope何时提升为分布式事务~续 将不确定变为确定~transactions ...

  8. TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成

    实事上,一个错误的理解就是Complete()方法是提交事务的,这是错误的,事实上,它的作用的表示本事务完成,它一般放在try{}的结尾处,不用判断前台操作是否成功,如果不成功,它会自己回滚. #re ...

  9. transactionscope报“此操作对该事务的状态无效”问题

    编写的保存方法里面有个transactionscope代码一直报"此操作对该事务的状态无效",弄了半天,原来是超时问题(transactionscope默认超时时间是1分钟) 经过 ...

  10. C#中TransactionScope的使用方法和原理

    在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Con ...

最新文章

  1. 《强化学习周刊》第35期:强化学习在智能交通中的最新应用
  2. 【学习笔记】Android 图像处理
  3. ASP.NET Core on K8S深入学习(7)Dashboard知多少
  4. flash动画制作作品_flash施工动画制作应该展现哪些内容
  5. linux下C调用lua的第一个程序
  6. 【LeetCode 69】Sqrt(x)
  7. Flutter代码锦囊---集中管理路由与导航
  8. 猜字游戏(python版加C语言版)
  9. 最新JAVA调用新浪微博API之发微博、发图片
  10. Qt视频直播软件--项目实战(Day5)
  11. 深度学习中常用的激励函数
  12. CreateThread和_beginthread区别及使用
  13. 京瓷打印机m5521cdn_京瓷M5521cdn驱动-京瓷ECOSYS M5521cdn打印机驱动下载 v5.1.2106官方版--pc6下载站...
  14. JAVA社区疫情防控系统毕业设计 开题报告
  15. java 反射 protected_通过Java反射机制访问private,protected变量和方法
  16. RPGMV修炼手册2——RPGMV的部分窗口代码学习
  17. Delphi好书推荐
  18. 邮件工具-MailUtil(发送邮件)
  19. html自动缩放不出现滚动条,HTML页面缩小后显示滚动条的示例代码
  20. matlab去除图像背景,从图像中移除背景(首选MATLAB、Java或Python)

热门文章

  1. java使用jGit时,跳过ssl验证,could not be established because of SSL problems
  2. Auto Code Generator
  3. 谈谈JS中的拷贝Copy复制的方法(Javascript拷贝)
  4. 长时间戴耳机有什么危害
  5. 1.3-CPU性能-CPU 使用率
  6. HTML5期末大作业:美妆网页设计——兰蔻商城6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
  7. 针织厂计算机社会实践报告,大学生寒假针织厂社会实践报告
  8. php 随机数整数,php生成随机数有哪几种方法
  9. WebApp开发框架①
  10. 如何为Windows 10的任务管理器打开“始终在最前面”