BLL中的一种方法跨越几种DAL方法的事务

BLL中的一种方法跨越几种DAL方法的事务,第1张

BLL中的一种方法跨越几种DAL方法的事务

好吧,首先,您必须遵守在BLL中指定为单个方法的原子工作单元。例如,这将创建客户,订单和订单项目。然后,您可以将所有内容整齐地包装在使用语句的TransactionScope中。TransactionScope是这里的秘密武器。下面是一些代码,很幸运,我现在正在工作:):

public static int InsertArtist(Artist artist){    if (artist == null)        throw new ArgumentNullException("artist");    int artistid = 0;    using (TransactionScope scope = new TransactionScope())    {        // insert the master Artist                artistid = SiteProvider.Artist.InsertArtist(new ArtistDetails(        0,        artist.BandName,        artist.DateAdded));        // insert the child ArtistArtistGenre        artist.ArtistArtistGenres.ForEach(item =>        { var artistartistgenre = new ArtistArtistGenreDetails(     0,     artistid,     item.ArtistGenreID); SiteProvider.Artist.InsertArtistArtistGenre(artistartistgenre);        });        // insert the child Artistlink        artist.Artistlinks.ForEach(item =>        { var artistlink = new ArtistlinkDetails(     0,     artistid,     item.linkURL); SiteProvider.Artist.InsertArtistlink(artistlink);        });        // insert the child ArtistProfile        artist.ArtistProfiles.ForEach(item =>        { var artistprofile = new ArtistProfileDetails(     0,     artistid,     item.Profile); SiteProvider.Artist.InsertArtistProfile(artistprofile);        });        // insert the child FestivalArtist        artist.FestivalArtists.ForEach(item =>        { var festivalartist = new FestivalArtistDetails(     0,     item.FestivalID,     artistid,     item.AvailableFromDate,     item.AvailableToDate,     item.DateAdded); SiteProvider.Festival.InsertFestivalArtist(festivalartist);        });        BizObject.PurgeCacheItems(String.Format(ARTISTARTISTGENRE_ALL_KEY, String.Empty, String.Empty));        BizObject.PurgeCacheItems(String.Format(ARTISTlink_ALL_KEY, String.Empty, String.Empty));        BizObject.PurgeCacheItems(String.Format(ARTISTPROFILE_ALL_KEY, String.Empty, String.Empty));        BizObject.PurgeCacheItems(String.Format(FESTIVALARTIST_ALL_KEY, String.Empty, String.Empty));        BizObject.PurgeCacheItems(String.Format(ARTIST_ALL_KEY, String.Empty, String.Empty));        // commit the entire transaction - all or nothing        scope.Complete();    }    return artistid;}

希望你能得到要点。基本上,这是一个成功或失败的工作,而不管任何不同的数据库如何(例如,在上面的示例中,artist和artistartistgenre可以托管在两个单独的数据库存储中,但是TransactionScope不会在乎这一点,它可以在COM
+级别工作并管理原子性可以“看到”的范围)

希望这可以帮助

编辑:
可能会发现TransactionScope的初始调用(在应用程序启动时)可能会稍微引起注意(即,在上面的示例中,如果是第一次调用,则可能需要2-3秒才能完成),但是,随后的通话
几乎是 瞬时的(即通常为250-750毫秒)。在简单的联系点交易与(笨拙的)替代方案之间进行权衡,可以减轻(对我和我的客户而言)最初的“加载”延迟。

只是想证明轻松并非没有妥协(尽管在初始阶段)



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5640553.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存