• ADO.NET 2.0中新的事务处理机制的引入带来前所未有的新体验(给所有不了解TransactionScope的朋友,以及还在用SqlTransaction的朋友)


            由于在ADO.NET 1.1中的固定的事务处理方式,让我直到今天才了解到ADO.NET 2.0对事务新的理解与重新编写的事务机制,不但包含了数据库的事务支持,而且还被应用于其它如:文件IO处理、消息机制等可以应用事务的代码块内。

            新的事务处理架构不再与数据库绑在一起,而是从代码块的角度,当在通过 new 语句实例化 TransactionScope 时,事务管理器将确定要参与哪个事务。一经确定,此范围将始终参与该事务。

            也就是说只要是代码块是可以被事务管理器所管理的,则允许该代码块范围所参与的事务继续。如果事务范围中的代码发生了异常,它所参与的事务将回滚。也只有当应用程序完成它要在一个事务中执行的所有工作以后,您应当调用TransactionScope的Complete 方法,以通知事务管理器可以接受提交事务。如在代码块内未能调用此方法将中止该事务,也就是隐式的进行了Rollback。对 Dispose 方法的调用标志着该事务范围的结束。在调用此方法之后发生的异常不会影响该事务。

            详细的情况,请大家到MSDN中去了解。地址:http://msdn2.microsoft.com/zh-cn/library/system.transactions.transactionscope(VS.80).aspx

            OK,说了这么多,下面我将用SqlTranasction的方式与新的TransactionScope来写同一段代码,看看有什么不同。以及对编程效率及代码洁净的作用。

    环境:VS2005 控制台项目 数据库(SqlServer2000中自带的Northwind) 用户表(Region)
    操作:使用事务方式录入一条记录到用户表中。
    使用SqlTransaction的方式(老式的,也是我用了多年的,现已被我抛弃了) 

    static void Main(string[] args)
    {
        SqlConnection conn 
    = new SqlConnection(
                  
    "Data Source=JSL-KEN-2003\\JSL_KEN_2000;Initial Catalog=Northwind;User ID=sa");
        
    using (conn)
        {
            conn.Open();
            
    using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText 
    =
                        
    "Insert Into Region (RegionID,RegionDescription) Values(5,'东北')";
                
    // 在这里用到了SqlTransaction看看有多笨重
                SqlTransaction trans = conn.BeginTransaction();
                
    // 这里还要把cmd和trans挂接起来
                cmd.Transaction = trans;
                cmd.ExecuteNonQuery();
                trans.Commit();
                Console.WriteLine(
    "已录入一条记录到数据库中");
                
    // trans.Rollback();
                
    // Console.WriteLine("录入记录的操作已被中止");
            }
            Console.ReadLine();
        }
    }

    使用TransactionScope方式(我现在用的方式,也是我所推荐的)

    static void Main(string[] args)
    {
        
    /// 看看新的事务处理带的方便性
        using (TransactionScope t = new TransactionScope())
        {
            SqlConnection conn 
    = new SqlConnection(
                
    "Data Source=JSL-KEN-2003\\JSL_KEN_2000;Initial Catalog=Northwind;User ID=sa");
            
    using (conn)
            {
                conn.Open();
                
    using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText 
    =
                        
    "Insert Into Region (RegionID,RegionDescription) Values(5,'为人民服务')";
                    cmd.ExecuteNonQuery();
                    
    // 一直到这里,你的写法和没有进行事务操作的写法一样方便
                    
    // 不同的地方在下面这一句,加上就像调用了老式事务的Commit一样,上面所有的操作被提交。
                    
    //t.Complete();
                    
    //Console.WriteLine("已录入到系统中");
                    Console.WriteLine("没有录入到系统中");
                }
            }
        }
        Console.ReadLine();
    }

             如果你没有调用t.Complete()方法,那么到代码块结束的位置,自动调用t.Dispose(),则会隐式的调用t.Rollback方法。

            怎么样,方便吧。

            当然,如果你已知道VS2005中新的事务方式,那么非常抱歉担误了你宝贵的时间。如果你和昨天的我一样,还在使用老的事务方式的话,恭喜你。

            代码下载请点击这里

            已对标题做了修改,谢谢各位的意见。


     

  • 相关阅读:
    五种常见的 PHP 设计模式
    转载:php header下载乱码 空格 问题
    PHP程序员最常犯的11个MySQL错误
    启迪人心:10个的有关编程的至理名言
    如何使用搜索技巧来成为一名高效的程序员
    随机验证码
    产生sql表中表示字段, 实现自增列
    在当前页面弹出对话框
    读取页面传入的URL值
    Sql临时表
  • 原文地址:https://www.cnblogs.com/KingOfSoft/p/747760.html
Copyright © 2020-2023  润新知