zoukankan      html  css  js  c++  java
  • .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 
    世上本无垃圾,所谓垃圾是你放错了地方! 
    每天积累一点点,那么理想便会距离我们越来越近! 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    「运维之美」技术周刊 ( 第 2 期 )
    Win10下MySQL(5.7和8两个版本)忘记root密码的解决办法
    SpringBoot使用自定义注解实现简单参数加密解密(注解+HandlerMethodArgumentResolver)
    Set的交集、差集踩坑记录
    RocketMQ控制台命令
    IDEA远程连接和上传文件到服务器
    记录一下JProfiler的使用
    点击验证码刷新的实现
    算法学习:我终于明白二分查找的时间复杂度为什么是O(logn)了
    Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
  • 原文地址:https://www.cnblogs.com/sylone/p/6081013.html
Copyright © 2011-2022 走看看