微软自带的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 bool FixProjectSorceInsert()
        {
            bool result = true;
            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);
                    result = false;
                }
                finally
                {
                    //释放资源
                    scope.Dispose();
                }

}
            return result;
        }

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

C# TransactionScope 事务类的更多相关文章

  1. 导入Excel的时候使用TransactionScope事务控制来进行数据

    最近,项目需要将Excel里面的数据导入到数据库里面,但是由于Excel里面的数据的合法性和数据格式的不确定性.所以不可能每读出一条数据,就保存到数据库中. 这就使用到了TransactionScop ...

  2. c#传统SqlTransaction事务和TransactionScope事务

    事务有很多种,看了一些关于事务的问题,这里做下笔记····· 事务时单个的工作单位.如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中永久的组成部分.若果事务遇到错误,则必须取消或 ...

  3. EF 多线程TransactionScope事务异常"事务EFTransaction类定义:与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"

    解决方案代码一:使用lock锁定 //对于锁推荐使用静态私有静态变量 private readonly static object _MyLock = new object(); /// <su ...

  4. EntityFramework与TransactionScope事务和并发控制

    最近在园子里看到一篇关于TransactionScope的文章,发现事务和并发控制是新接触Entity Framework和Transaction Scope的园友们不易理解的问题,遂组织此文跟大家共 ...

  5. TransactionScope事务对多个数据库的操作

    .Net 2.0引入了轻量级事务管理器(Lighweight Transaction Manager),即System.Transactions.TransactionManager. 轻量级事务管理 ...

  6. .Net TransactionScope事务

    使用TransactionScope类 正如名称所暗示,TransactionScope类用于限定事务代码块,其具有一些明显优点,例如范围与应用程序对象模型无关,同时提供了一个简单直观的编程模型等等. ...

  7. TransactionScope 事务

    一.TransactionScope是.Net Framework 2.0之后,新增了一个名称空间.它的用途是为数据库访问提供了一个"轻量级"[区别于:SqlTransaction ...

  8. TransactionScope 事务使用说明

    TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间.它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物.使用之前必须添 ...

  9. TransactionScope事务

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

随机推荐

  1. SQLServer2005 没有日志文件(*.ldf) 只有数据文件(*.mdf) 恢复数据库的方法

    代码如下: exec sp_attach_db exun,'d:\exun2.mdf' (可能执行一次不能成功,测试了下,有时候需要执行2次以上命令才行) 执行了之后,记得刷新数据库,不然是不会显示的

  2. Python学习笔记(四)Python程序的控制结构

    在学习了 Python 的基本数据类型后,我们就要开始接触Python程序的控制结构,了解 Python 是如何使用控制结构来更改程序的执行顺序以满足多样的功能需求.如果有的小伙伴在之前学过C语言,j ...

  3. IntelliJ IDEA 下的SVN使用(傻瓜式教学)(转)

    第一步:下载svn的客户端,通俗一点来说就是小乌龟啦!去电脑管理的软件管理里面可以直接下载,方便迅速 下载之后直接安装就好了,但是要注意这里的这个文件也要安装上,默认是不安装的,如果不安装,svn中的 ...

  4. Chrome浏览器一直请求clients1.google.com:443

    浏览器莫名其妙地发一大堆请求,往clients1.google.com:443,把各种扩展各种插件关了都不管用,后来才发现问题,取消“密码和表单”中的“自动填充”功能,即可解决.

  5. saltstack+python批量修改服务器密码

    saltstack安装:略过 python脚本修改密码: # -*- coding utf-8 -*- import socket import re import os import sys imp ...

  6. Python PEP8标准

    1.编码 如无特殊情况,文件一律使用utf-8编码 如无特殊情况,文件头部必须添加# -*- coding:utf-8 -*- 标志 2.代码 统一使用四个空格缩进 每行代码不超过80个字符 自然语言 ...

  7. MSSQL → 04:表的创建与维护

    一.创建表 1.1.使用SQL Server Management Studio创建表 ①.打开刚刚建立的CollegeSystemDB数据库,找到表(数据库->CollegeSystemDB- ...

  8. python ddt 实现数据驱动

    ddt 是第三方模块,需安装, pip install ddt DDT包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据) 通常情况下,data中的数据按照一个参数传递给测试用例,如果da ...

  9. IDEA:将WEB-INF\lib下的Jar包添加到项目中

    打开Project Structure[可以使用快捷键:Ctrl+Alt+Shift+S] 左侧选中Modules,在Dependecies中,点击右侧"+"号,选择JARS or ...

  10. Directx11 教程(1) 基本的windows应用程序框架(1)

    原文:Directx11 教程(1) 基本的windows应用程序框架(1)        在vs2010中,建立一个新的win32工程,名字是: myTutorialD3D11, 注意:同时勾选Cr ...