两种实现事务方法的比较

引言

提到事务,大部分人都知道数据库和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

 

posted @ 2008-02-20 15:18 Robin Zhang 阅读(...) 评论(...) 编辑 收藏