您将如何从业务逻辑层中的一种方法在数据访问层中调用几种方法,以使所有SQL命令都驻留在一个SQL事务中?
可以从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
/*
we plug the artistid variable into
any child instance where ArtistID is required
*/
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毫秒)。在简单的联系点交易与(笨拙的)替代方案之间进行权衡,可以减轻(对我和我的客户而言)最初的“加载”延迟。
只是想证明轻松并非没有妥协(尽管在初始阶段)
本文向大家介绍C#调用JS的几种方法,包括了C#调用JS的几种方法的使用技巧和注意事项,需要的朋友参考一下 cmd调用phantomjs 官方资料:http://phantomjs.org/quick-start.html 手动执行 从官方下载phantomjs.exe,拷贝它与要执行的js同目录 打开cmd,输入命令行(参考官方资料的命令行) 获得结果 使用C#执行 示例代码:https://g
本文向大家介绍Android中去掉标题栏的几种方法(三种),包括了Android中去掉标题栏的几种方法(三种)的使用技巧和注意事项,需要的朋友参考一下 1.在java代码中 (SplashActivity继承AppCompatActivity时无效) 2.在manifest.xml中改Theme 3.先在style.xml中自定义style 再在manifest.xml中引用 以上所述是小编给大家
本文向大家介绍Nginx实现404页面的几种方法(三种),包括了Nginx实现404页面的几种方法(三种)的使用技巧和注意事项,需要的朋友参考一下 一个网站项目,肯定是避免不了404页面的,通常使用Nginx作为Web服务器时,有以下集中配置方式,一起来看看。 第一种:Nginx自己的错误页面 Nginx访问一个静态的html 页面,当这个页面没有的时候,Nginx抛出404,那么如何返回给客户端
本文向大家介绍js实现跨域的多种方法,包括了js实现跨域的多种方法的使用技巧和注意事项,需要的朋友参考一下 从域说起 域: 域是WIN2K网络系统的安全性边界。我们知道一个计算机网最基本的单元就是“域”,这一点不是WIN2K所独有的,但活动目录可以贯穿一个或多个域。在独立的计算机上,域即指计算机本身,一个域可以分布在多个物理位置上,同时一个物理位置又可以划分不同网段为不同的域,每个域都有自己的安全
本文向大家介绍Django实现跨域的2种方法,包括了Django实现跨域的2种方法的使用技巧和注意事项,需要的朋友参考一下 jsonp 方式一:指定返回方法 方式二:不指定返回方法 cors 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍Android添加音频的几种方法,包括了Android添加音频的几种方法的使用技巧和注意事项,需要的朋友参考一下 在res文件夹中新建一个文件夹,命名为raw。在里面放入我们需要的音频文件。 第一种: 第二种: 特别要注意的是:音频文件是占系统资源的 ,要重写onDestroy方法,退出的时候释放资源。 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的