.Net TransactionScope事务
使用TransactionScope类
正如名称所暗示,TransactionScope类用于限定事务代码块,其具有一些明显优点,例如范围与应用程序对象模型无关,同时提供了一个简单直观的编程模型等等。在该类的构造函数内部,TransactionScope对象创建了一个事务(.NET 2.0中默认时轻量级事务管理器),同时将该事务设置给Transaction类的Current属性。由于TransactionScope是可释放对象,所以事务将调用Dispose()方法释放该对象:
using(TransactionScope scope = new TransactionScope()) |
示例2列举了一种在.NET 2.0中创建事务的方法。在TransactionScope对象定义的代码块中创建和释放该对象。使用TransactionScope对象的构造函数和TransactionScopeOption枚举,开发人员能够定义是否需要新事务,或者是否应该使用已经在外部块中存在的事务。TransactionScope.Complete()方法指示事务范围内的所有操作都已成功完成。在using语句结尾处(调用Dispose()方法的位置),定义了事务块的输出。如果由于发生异常而没有调用Complete()方法,那么放弃事务。如果在事务范围内成功完成,则如果事务是根事务,那么当事务是根事务时就提交事务。如果范围内的不是根事务,那么会影响事务输出。
例2:使用TransactionScope实现隐式事务
<%@ Page Language="C#" %> |
以下是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(); }
出处:http://www.cnblogs.com/yhyjy/
新浪微博:http://weibo.com/u/2709913775
世上本无垃圾,所谓垃圾是你放错了地方!
每天积累一点点,那么理想便会距离我们越来越近!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。