在企業級開發中,為保持業務資料的一致性,事務是經常需要用到的。
在CSLA架構中,有文章說只要給方法加上標籤([Transactional(TransactionalTypes.TransactionScope)]),就可以實現。經過我的大量實踐,這個標籤沒有作用。
我們最初使用的是SqlTransaction,將事務作為參數在方法之間傳遞,這樣做會產生兩個問題:
1.業務方法間的調用發生在資料訪問層DAO,這樣必然會將一些商務邏輯也寫在資料訪問層,商務邏輯層將失去應有的作用。
2.事務很難控制,代碼量大,在調用其它業務方法時,不一定會有事務的參數。
解決辦法是在商務邏輯層使用 TransactionScope(經量級事務),方法如下:
1.在工程中引用System.Transactions.dll
2.在類檔案中引入命名空間using System.Transactions;
3.重寫CSLA的方法,代碼如下:
ResumeScore類的Save方法 1 public override ResumeScore Save()
2 {
3 ResumeScore resumeScore = null;
4 using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
5 {
6 resumeScore = base.Save();
7 ts.Complete();
8 }
9 return resumeScore;
10 }Resume類的Save方法 1 public override Resume Save()
2 {
3 Resume resume = null;
4 using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
5 {
6 resume = base.Save();
7 if (this.ResumeScore != null)
8 {
9 this.ResumeScore.Save();
10 }
11 ts.Complete();
12 }
13 return resume;
14 }
在上述代碼中,Resume的Save方法中調用ResumeScore的Save方法,這樣業務處理就寫在了業務層,並且實現了事務的處理。
說明, TransactionScope的說明與用法,請參考:http://www.cnblogs.com/zhangpengshou/archive/2009/07/20/1527269.html
注意:需要啟動分散式交易及開啟網路訪問,可以查閱其它資料,如http://www.cnblogs.com/dengsu888666/archive/2007/04/02/696555.html