兩種實現(xiàn)事務(wù)方法的比較
引言
提到事務(wù),大部分人都知道數(shù)據(jù)庫和Com+中有事務(wù)性,其實在.net framework中,還提供了一種集成了Ado.Net和SQL Server common language runtime (CLR)的方法,采用System.Transactions.TransactionScope也能實現(xiàn)數(shù)據(jù)訪問的事務(wù)性。
本文目的
通過閱讀本文,您可以了解以下知識
- 向您介紹一種新的實現(xiàn)事務(wù)的方式
- System.Transactions.TransactionScope的應(yīng)用場合
- 和數(shù)據(jù)庫事務(wù)比較,二者在性能上的差距
向您介紹一種新的實現(xiàn)事務(wù)的方式
.Net Frameworl 2.0為我們新增了命名空間,System.Transactions,這個命名空間為我們提供了一種新的實現(xiàn)事務(wù)的方案,它能組織一系列的代碼,如果不執(zhí)行Complete方法,這些被組織的代碼的執(zhí)行將無效。
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的應(yīng)用場合
傳統(tǒng)的數(shù)據(jù)庫事物有一定的弊端,比如下面這種這種情形:
User和MemberShip是父子類的關(guān)系,且各自有各自的實現(xiàn),User類也是實現(xiàn)類,非抽象類,而數(shù)據(jù)庫中數(shù)據(jù)表設(shè)計如下:
那么在實現(xiàn)Add方法的時候,特別是MemberShip的Add方法如何保證User和UserDetail兩個數(shù)據(jù)表操作的事務(wù)性呢?
當然我們可以使用兩個不同的SQL,用SqlTransaction來保證事務(wù)性,但MemberShip的Add代碼是不是就有重復的地方呢,這樣的實現(xiàn)看起來怎么也不美觀,因為子類并沒有享受到父類給與的恩賜。那么使用System.Transactions.TransactionScope便可以解決這個問題,我們可以先實現(xiàn)User.Add(),因為MemberShip繼承于User,當實現(xiàn)MemberShip的Add方法時,便可以如下做
public override bool Add()
{
bool pRes = false;
using (System.Transactions.TransactionScope tx = new System.Transactions.TransactionScope())
{
//這個首先調(diào)用服務(wù)的添加方法,填充數(shù)據(jù)表Users
pRes = base.Add();
//下面可以實現(xiàn)向UserDetail中添加數(shù)據(jù)

if(都成功了)
{
//提交,相當于Commit
tx.Complete();
}
}
return pRes;
}
這樣的實現(xiàn),顯得會 更OO一些。
和數(shù)據(jù)庫事務(wù)比較,二者在性能上的差距
既然有些場合是適合使用System.Transactions.TransactionScope的,那他的性能如何呢?自己做了一個簡單的測試,得出下面的測試數(shù)據(jù)
|
循環(huán)次數(shù) |
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 |
從上面的測試結(jié)果可以看出System.Transactions.TransactionScope的性能比SqlTransaction要低,大概在10倍之內(nèi)。
測試項目文件
測試項目: /Files/jillzhang/TxCompare.rar
數(shù)據(jù)庫文件: /Files/jillzhang/db.rar
出處:http://jillzhang.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權(quán)利。


浙公網(wǎng)安備 33010602011771號