使用TransactionScope类

正如名称所暗示,TransactionScope类用于限定事务代码块,其具有一些明显优点,例如范围与应用程序对象模型无关,同时提供了一个简单直观的编程模型等等。在该类的构造函数内部,TransactionScope对象创建了一个事务(.NET 2.0中默认时轻量级事务管理器),同时将该事务设置给Transaction类的Current属性。由于TransactionScope是可释放对象,所以事务将调用Dispose()方法释放该对象:

using(TransactionScope scope = new TransactionScope()) 

/*在这里实现事务性工作 */ 
// 没有错误——提交事务 
scope.Complete(); 
}

示例2列举了一种在.NET 2.0中创建事务的方法。在TransactionScope对象定义的代码块中创建和释放该对象。使用TransactionScope对象的构造函数和TransactionScopeOption枚举,开发人员能够定义是否需要新事务,或者是否应该使用已经在外部块中存在的事务。TransactionScope.Complete()方法指示事务范围内的所有操作都已成功完成。在using语句结尾处(调用Dispose()方法的位置),定义了事务块的输出。如果由于发生异常而没有调用Complete()方法,那么放弃事务。如果在事务范围内成功完成,则如果事务是根事务,那么当事务是根事务时就提交事务。如果范围内的不是根事务,那么会影响事务输出。

例2:使用TransactionScope实现隐式事务

<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Transactions" %>
<%@ Import Namespace="System.Web.Configuration" %>
Width="179px"> 
  
OnClick="btnSave_Click" />

Font-Size="Small" />

 
在示例2中,对于Mydatabase数据库执行插入的SQL语句包括在使用using块的TransactionScope对象中。InsertCategroy()方法执行实际的向ProductCategory表插入新记录的工作。在插入记录后,该方法向调用者返回新近插入记录的标识值(类别ID列)。一旦代码成功执行,则调用TransactionScope对象的Complete()方法,以便告知.NET Framework语句已经成功执行完成,事务导致的结果将提交给数据库。

以下是TransactionScope所完成的一些内容:

出现在using语句括号中的任何语句将在事务范围内执行。 
任何在块中创建的连接将在事务中登记。 
如果在using块中发生错误,则事务将自动回滚。 
如果语句成功执行,那么作为工作的一部分,需要在事务中调用Complete()方法。 
调用堆栈的每一步必须调用Complete(),以便提交事务。

TransactionScope对象无法了解是否应该提交或者放弃事务,TransactionScope的主要目标是避免开发人员与事务直接交互。为了解决这个问题,每个TransactionScope对象都有一个一致性位,其默认设置为false。通过调用Complete()方法能够将一致性位设置为true。注意,只能调用一次Complete()。后续对Complete()的调用将引发InvalidOperation异常,因为在调用Complete()之后,不能保证还有事务性代码。

ASP.NET中的自动化事务

通过在ASP.NET页面中添加Transaction属性,可使得ASP.NET能够在系统中支持自动事务。利用Transaction属性,开发人员能够指示页面参与现有事务,开始新事务,或者不参与事务。下表列举了ASP.NET中可用的Transaction属性值。

图片部分的源代码:

图1

事例:

 using (TransactionScope tsCope = new TransactionScope())
{
var sailorLetterApplyForm = _sailorLetterApplyFormRepository.Get(Id); if (sailorLetterApplyForm != null)
{
_sailorLetterApplyFormRepository.Remove(sailorLetterApplyForm);
_sailorLetterApplyFormRepository.UnitOfWork.Commit();
}
else
LoggerFactory.CreateLog().LogWarning("不能删除不存在的证书申请");
tsCope.Complete();
}
作者:Elite.net 
出处:http://www.cnblogs.com/yhyjy/ 
新浪微博:http://weibo.com/u/2709913775
世上本无垃圾,所谓垃圾是你放错了地方! 
每天积累一点点,那么理想便会距离我们越来越近! 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

.Net TransactionScope事务的更多相关文章

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

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

  2. C# TransactionScope 事务类

    微软自带的TransactionScope(.Net Framework 2之后)是个好东东,提供的功能也很强大. 首先说说TransactionScope是什么,并能为我们做什么事情.其实看Tran ...

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

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

  4. TransactionScope 事务使用说明

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

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

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

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

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

  7. TransactionScope事务

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

  8. TransactionScope事务使用

    using (System.Transactions.TransactionScope T_Scope = new System.Transactions.TransactionScope()) { ...

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

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

随机推荐

  1. history对象 back() forward() go() 和pushState() replaceState()

    History(Window.history对象)对象保存着用户上网的历史记录.处于安全方面的考虑,开发人员无法得知用户浏览过的URL,但是借由用户访问过的页面列表,同样可以在不知道实际URL的情况下 ...

  2. php 编程效率(2)

    1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...

  3. 如何区分javascript中的方法(method)、函数(function)、事件(event)三个概念?

    方法是程序对某操作的处理,比如show(),你可以在触发单击事件的时候调用show(),也可以在双击的时候调用. 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.比如自己写的倒计时函数,触 ...

  4. Java中ArrayList的使用

    //创建ArrayList ArrayList arr  = new ArrayList(); //ArrayList添加数据 arr.add("123"); arr.add(&q ...

  5. PAT 团体程序设计天梯赛-练习集L1-011. A-B

    本题要求你计算A-B.不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A-B. 输入格式: 输入在2行中先后给出字符串A和B.两字符串的长度 ...

  6. tomcat 启动超时

    1.如果是eclipse 里集成的tomcat  在server 下 双击tomcat 在tomcat 配置里将启动时间延长,保存再启动. 2.如果是非集成的tomcat  则在tomcat的配置文件 ...

  7. C# 非public的方法和属性的单元测试

    有时候我们写好的类库中,某些类的属性和方法不应该暴露出来,那么如何对这些非public的方法和属性进行单元测试? MS为我们提供了PrivateObject类,可以解决这个问题,可以去MSDN的说明文 ...

  8. STL学习:STL库vector、string、set、map用法

    本文仅介绍了如何使用它们常用的方法. vector 1.可随机访问,可在尾部插入元素:2.内存自动管理:3.头文件#include <vector> 1.创建vector对象 一维: (1 ...

  9. sed 一些用法

    sed  /^[[:space:]]*$/d        删除空行 sed "/^$/d"         删除空行 sed "/^#/d"     删除 开 ...

  10. HDU 1969 Pie(二分搜索)

    题目链接 Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pi ...