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

转自:http://www.cnblogs.com/huangyangblogs/p/3305602.html

TransactionScope的更多相关文章

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

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

  2. 探索逻辑事务 TransactionScope

    一.什么是TransactionScope? TransactionScope即范围事务(类似数据库中的事务),保证事务声明范围内的一切数据修改操作状态一致性,要么全部成功,要么全部失败回滚. MSD ...

  3. 事务使用中如何避免误用分布式事务(System.Transactions.TransactionScope)

    1:本地事务DbTransaction和分布式事务TransactionScope的区别: 1.1:System.Data.Common.DbTransaction: 本地事务:这个没什么好说了,就是 ...

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

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

  5. 转:C#中TransactionScope的使用方法和原理

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

  6. C# TransactionScope 使用

    注意: Windows 服务中,开启Distributed Transaction Coordinator 服务. using (var scope = new TransactionScope()) ...

  7. TransactionScope oracle不能用的问题(转载)

    报错:“无法加载oramts.dll ”的错误 参见文章:关于TransactionScope分布式事务在Oracle下的运作

  8. TransactionScope 使用记录

    最近使用TransactionScope来进行处理不同数据库的操作问题,当看到这里的时候肯都是在使用或者要使用的吧,关于他的使用网络上一大堆,我在使用的时候遇到了一下的问题,作为记录,可能会对以后使用 ...

  9. 关于分布式事务的一个误解:使用了TransactionScope就一定会开启分布式事务吗?

    背景: 事务是数据库管理系统的一个基本概念,事务具有四个基本特点,即ACID:原子性(Atomicity).一致性(Consistency).隔离性(Isolation)和持久性(Durability ...

  10. TransactionScope类的使用

    如果在C#中使用TransactionScope类(分布式事务),则须注意如下事项:1.在项目中引用using System.Transactions命名空间(先要在添加net组件的引用); 2.具体 ...

随机推荐

  1. 中文输入法在vs2010中失效解决方案

    这样你就可以用切换输入法的方式,输入中文咯.     后来用了2次发现还是有问题,后来我就直接把输入法的切换改成ctrl+1,后来使用就一直没有问题.总之,解决方案视具体情况解决.

  2. POJ2299+逆序数

    归并排序!!!!!!!!!! /* 归并排序+求逆序数 */ #include<stdio.h> #include<string.h> #include<algorith ...

  3. mjpg-streamer on raspberrypi

    http://sourceforge.net/projects/mjpg-streamer/ svn address svn checkout svn://svn.code.sf.net/p/mjpg ...

  4. SQLite入门与分析(六)---再谈SQLite的锁

    写在前面:SQLite封锁机制的实现需要底层文件系统的支持,不管是Linux,还是Windows,都提供了文件锁的机制,而这为SQLite提供了强大的支持.本节就来谈谈SQLite使用到的文件锁——主 ...

  5. android usb Host模式下与usb Hid 设备的通信

    做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法: 1,第一次遇到的问题:android 版本低不支持usb hid, 被要求做相关项目的时候,就从mUsbMana ...

  6. 如何迁移SharePoint 2010至新的站点

    SharePoint使用非常方便,但是有一个问题获取会困扰大家,就是SharePoint的备份和迁移.下面我们来看一下如何把SharePoint迁移至别的SharePoint站点. 1. 使用网站集管 ...

  7. 转:Web service是什么?

    作者: 阮一峰 我认为,下一代互联网软件将建立在Web service(也就是"云")的基础上. 我把学习笔记和学习心得,放到网志上,欢迎指正. 今天先写一个最基本的问题,Web ...

  8. WCF - Overview

    WCF stands for Windows Communication Foundation. The elementary feature of WCF is interoperability. ...

  9. 应付分配集 Distribution Sets

    (N) AP > Setup > Invoice > Distribution Sets (定义分配集) You can use a Distribution Set to auto ...

  10. as3+java+mysql(mybatis) 数据自动工具(二)

    AutoScript 项目结构如下图 ---AutoScript.java 为程序入口 ---com.autoscript.object 同步 as3 和 java 的数据类 ---com.autos ...