两种实现事务方法的比较
引言
提到事务,大部分人都知道数据库和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 (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方法时,便可以如下做
{
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
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。