博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net TransactionScope事务
阅读量:6818 次
发布时间:2019-06-26

本文共 2394 字,大约阅读时间需要 7 分钟。

使用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();            }

 

转载于:https://www.cnblogs.com/yhyjy/archive/2013/04/26/3044670.html

你可能感兴趣的文章
js获取浏览器高度和宽度值(多浏览器)
查看>>
Deep learning:十六(deep networks)
查看>>
▲移动web前端开发
查看>>
LeetCode: Palindrome Partition
查看>>
推荐使用C++ 11
查看>>
C#中的接口
查看>>
osg学习示例之遇到问题四骨骼动画编译osgCal
查看>>
Vue 实例暴露了一些有用的实例属性与方法。这些属性与方法都有前缀 $,以便与代理的 data 属性区分...
查看>>
站立会议(2)
查看>>
HDU 1018 Big Number(数论,Stirling公式)
查看>>
从零开始做SSH项目(二)
查看>>
spring ioc aop 理解
查看>>
222
查看>>
在使用react时的异步问题解决
查看>>
Java调用solrj5.5.3接口,查询数据
查看>>
Python中的logging模块
查看>>
plink, vcftool计算等位基因频率(allele frequency,vcf)
查看>>
变量和赋值
查看>>
mysql的优化
查看>>
关于域证书的发布CA和CRL的内容 (Windows 2008 Server R2 SP1)
查看>>