CSLA中业务层事务的实现

在企业级开发中,为保持业务数据的一致性,事务是经常需要用到的。

在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

 

标签: CSLA 事务

posted on 2010-08-22 14:46 白亚伟 阅读(787) 评论(7) 编辑 收藏

评论

#1楼  回复 引用 查看   

前几个月,我看过这个框架,它的事务的实现是没有问题的
2010-08-23 10:41 | cdboy      

#2楼  回复 引用 查看   

TransactionScope在多个数据库连接的情况下会将事务提升至分布式事务。而分布式事务的资源占用比普通事务要高。
很软的企业库提供了事务处理模块,它不会提升到分布式事务。
博主可以自己实现的TransactionScope类,调用的方式可以和TransactionScope类一样,但可以重用数据库连接而不用提升至分布式事务。
2010-08-23 16:13 | leo gu      

#3楼[楼主]  回复 引用 查看   

@cdboy
你好,我查看相关资料,有人说其事务可以实现,也有人跟我遇到相同的问题,即使用[Transactional(TransactionalTypes.TransactionScope)]不能解决问题,这位仁兄有相关代码的话,不妨发给我一下,我再研究研究。2楼的仁兄说占用资源高,我也有点顾虑!
2010-08-25 15:49 | brawei      

#4楼[楼主]  回复 引用 查看   

@leo gu
谢谢,我查下资料!
2010-08-25 15:49 | brawei      

#5楼[楼主]  回复 引用 查看   

在CSLA的官网论坛上其作者有说到,Transactional特性只能用在根对象的DataPortal_XYZ方法上,不能用在Save()方法上,所以这也是我之前使用Transactional特性没有效果的原因。其英文原意:The Transactional attribute is only useful when applied to a DataPortal_XYZ method of a root object. It has absolutely no meaning on any other method.
链接地址(见文中2楼):http://forums.lhotka.net/forums/p/5906/28714.aspx#28714
2010-08-30 16:24 | brawei      

#6楼  回复 引用 查看   

嘿嘿,路过,发现小白。
2010-08-31 01:23 | ldljlq      

#7楼  回复 引用 查看   

注意:需要启动分布式事务及开启网络访问
对于只能操作服务器当前站点虚拟目录的人来说,伤不起。
2012-02-01 16:22 | alxc      

导航

公告

 大家好,我叫白亚伟,现在成都一家科技公司做软件开发,06起从事信息化管理软件开发。目前致力于铁路信息化建设,关注用户业务,企业架构,正学习实践敏捷个人。

昵称:白亚伟
园龄:5年7个月
粉丝:6
关注:0

搜索

 
 

常用链接

随笔分类(38)

随笔档案(40)

博客园

站点收藏

积分与排名

  • 积分 - 19605
  • 排名 - 5213

最新评论

阅读排行榜

评论排行榜

推荐排行榜