.Net TransactionScope事务

使用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 
世上本无垃圾,所谓垃圾是你放错了地方! 
每天积累一点点,那么理想便会距离我们越来越近! 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2016-11-19 17:22  在西天取经的路上……  阅读(377)  评论(0编辑  收藏  举报