zoukankan      html  css  js  c++  java
  • 两种实现事务方法的比较

    引言

    提到事务,大部分人都知道数据库和Com+中有事务性,其实在.net framework中,还提供了一种集成了Ado.Net和SQL Server common language runtime (CLR)的方法,采用System.Transactions.TransactionScope也能实现数据访问的事务性。

    本文目的

    通过阅读本文,您可以了解以下知识

    1. 向您介绍一种新的实现事务的方式
    2. System.Transactions.TransactionScope的应用场合
    3. 和数据库事务比较,二者在性能上的差距

    向您介绍一种新的实现事务的方式

    .Net Frameworl 2.0为我们新增了命名空间,System.Transactions,这个命名空间为我们提供了一种新的实现事务的方案,它能组织一系列的代码,如果不执行Complete方法,这些被组织的代码的执行将无效。

    Msdn给出的实例为:  

    using (TransactionScope transScope = new TransactionScope())
    {
        
    using (SqlConnection connection1 = new 
           SqlConnection(connectString1))
        
    {
            
    // Opening connection1 automatically enlists it in the 
            
    // TransactionScope as a lightweight transaction.
            connection1.Open();

            
    // Do work in the first connection.

            
    // Assumes conditional logic in place where the second
            
    // connection will only be opened as needed.
            using (SqlConnection connection2 = new 
                SqlConnection(connectString2))
            
    {
                
    // Open the second connection, which enlists the 
                
    // second connection and promotes the transaction to
                
    // a full distributed transaction. 
                connection2.Open();

                
    // Do work in the second connection.
            }

        }

        
    //  The Complete method commits the transaction.
        transScope.Complete();
    }

    System.Transactions.TransactionScope的应用场合

    传统的数据库事物有一定的弊端,比如下面这种这种情形:

    User和MemberShip是父子类的关系,且各自有各自的实现,User类也是实现类,非抽象类,而数据库中数据表设计如下:

    那么在实现Add方法的时候,特别是MemberShip的Add方法如何保证User和UserDetail两个数据表操作的事务性呢?

    当然我们可以使用两个不同的SQL,用SqlTransaction来保证事务性,但MemberShip的Add代码是不是就有重复的地方呢,这样的实现看起来怎么也不美观,因为子类并没有享受到父类给与的恩赐。那么使用System.Transactions.TransactionScope便可以解决这个问题,我们可以先实现User.Add(),因为MemberShip继承于User,当实现MemberShip的Add方法时,便可以如下做

     public override bool Add()
            
    {
                
    bool pRes = false;
                
    using (System.Transactions.TransactionScope tx = new System.Transactions.TransactionScope())
                
    {
                    
    //这个首先调用服务的添加方法,填充数据表Users
                    pRes = base.Add();
                    
    //下面可以实现向UserDetail中添加数据
                      
                    
    if(都成功了)
                    
    {
                        
    //提交,相当于Commit
                        tx.Complete();
                    }


                }
             
                
    return pRes;
            }


    这样的实现,显得会 更OO一些。

    和数据库事务比较,二者在性能上的差距

    既然有些场合是适合使用System.Transactions.TransactionScope的,那他的性能如何呢?自己做了一个简单的测试,得出下面的测试数据

    循环次数

    SqlTransaction

    TransactionScope

    性能比

    100

    442183162

    15016030072

    33.95

    100

    361575387

    4891560000

    13.52

    100

    403243350

    4857052275

    12.04

    1000

    3675252488

    17089946707

    4.65

    1000

    4078101240

    17229690090

    4.22

    1000

    3589697130

    19112327573

    5.32

    10000

    46847708078

    119662532843

    2.55

    10000

    45370373625

    112767966525

    2.48

    从上面的测试结果可以看出System.Transactions.TransactionScope的性能比SqlTransaction要低,大概在10倍之内。

    测试项目文件

    测试项目: /Files/jillzhang/TxCompare.rar

    数据库文件: /Files/jillzhang/db.rar

  • 相关阅读:
    appium 环境安装windows
    解决windows7无法连接CentOS7系统中oracle问题:ORA-12514 TNS 监听程序当前无法识别
    linux系统(CentOS7)虚拟机上安装oracle 11g,解决oracle图形界面卡住无法点击next问题
    python自动化测试框架学习
    VSCode + GDBServer 远程调试C/C++流水账
    IDEA 16注册
    VS2008非托管C++调用wcf(WebService)服务
    python 从数据库表生成model
    2015年工作总结
    dlib库学习之一
  • 原文地址:https://www.cnblogs.com/jillzhang/p/1075057.html
Copyright © 2011-2022 走看看