引言
提到事务,大部分人都知道数据库和Com+中有事务性,其实在.net framework中,还提供了一种集成了Ado.Net和SQL Server common language runtime (CLR)的方法,采用System.Transactions.TransactionScope也能实现数据访问的事务性。
本文目的
通过阅读本文,您可以了解以下知识
- 向您介绍一种新的实现事务的方式
- System.Transactions.TransactionScope的应用场合
- 和数据库事务比较,二者在性能上的差距
向您介绍一种新的实现事务的方式
.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 阅读(3995)
评论(40) 编辑 收藏 网摘 所属分类:
.net framework