来自 BLL 中的一种方法的跨多个 DAL 方法的事务

2023-12-22

您将如何从业务逻辑层中的一个方法调用数据访问层中的多个方法,以便所有 SQL 命令都存在于一个 SQL 事务中?

每个 DAL 方法都可以从 BLL 中的其他位置单独调用,因此不能保证数据层方法始终是事务的一部分。我们需要此功能,因此如果数据库在长时间运行的过程中脱机,则不会提交。业务层根据之前每个调用的结果编排不同的数据层方法调用。我们只想在整个流程的最后进行提交(从业务层)。


首先,您必须遵守在 BLL 中指定为单个方法的原子工作单元。这将(例如)创建客户、订单和订单项目。然后,您可以将这一切整齐地包装在 TransactionScope using 语句中。 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;
}

希望你能明白要点。基本上,这是一个全部成功或失败的工作,无论任何不同的数据库(即在上面的示例中,艺术家和艺术家艺术家流派可以托管在两个单独的数据库存储中,但 TransactionScope 不太关心这一点,它在 COM+ 级别工作并管理原子性它可以“看到”的范围)

希望这可以帮助

EDIT:您可能会发现 TransactionScope 的初始调用(在应用程序启动时)可能会稍微引人注目(即在上面的示例中,如果第一次调用,可能需要 2-3 秒才能完成),但是后续调用是almost瞬时(即通常 250-750 毫秒)。简单的接触点交易与(笨拙的)替代方案之间的权衡可以减轻(对于我和我的客户而言)初始“加载”延迟。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 BLL 中的一种方法的跨多个 DAL 方法的事务 的相关文章

  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 如何在NiFi中映射流文件中的列数据?

    我有 csv 文件 其结构如下 Alfreds Centro Ernst Island Bacchus Germany Mexico Austria UK Canada 01 02 03 04 05 现在我必须将这些数据移入数据库 如下所示
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • MS ACCESS 计数/求和行数,不重复

    我有下表 我需要计算总行数而不包括任何重复记录 CustomerID test1 test1 test2 test3 test4 test4 如您所见 总行数为 6 但有两个 test1 和两个 test4 我希望查询返回 4 IOW 我想
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 使用 postgres 和 node js 在单个语句中执行多个查询

    我需要在像这样的单个语句中执行插入和删除查询 INSERT INTO COMPANY ID NAME VALUES 1 Paul DELETE FROM COMPANY WHERE ID 12 这是我用于执行查询的 node js 代码 p
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 计算表记录的最大存储大小?

    有没有办法确定 SQL Server 中记录的最大大小 而不是手动执行 例如 CREATE TABLE test id INT PRIMARY KEY IDENTITY 1 1 name VARCHAR 256 test date DATE
  • 通过电子邮件发送谷歌静态地图

    我可以在我的网站上显示谷歌静态地图图像 我创造 img src url 与电子邮件中的相同网址 图像以非常不同的方式显示 即世界地图 我检查了 chrome 中的元素 发现邮件服务器在其前面添加了一个 代理 url https ci6 go
  • TBXML 将复杂的 xml 解析为数组

    我有一个 xml 响应 需要将其设置为数组 问题是我需要访问每个元素并将其存储在数组中 以便我可以将其用于表视图
  • 如何使用复选框将电子邮件保存给订阅者?

    选中该框后 如何在单击 保存 后将用户的电子邮件从 输入电子邮件 添加到我的 mailchimp 订户列表中 用户 new html erb Get blog posts from Anthony Galli CEO Founder abo
  • 通过外部接口接收复杂的 JavaScript 值

    我正在尝试使用提供的外部对象通过 TWebBrowser 使用 TEmbeddedWB 接收并可能发送复杂值 例如 在 javascript 中 我会尝试使用公开的方法并以数组作为参数 var test 123 abc external s
  • 在 capistrano 部署之前在开发机器上进行资产预编译

    我希望在 capistrano 对代码进行打包 tar 打包 之前在我的开发计算机上进行资产预编译 并且预编译资产已包含在最终部署包中 当我尝试内置的 capistrano 食谱时load deploy assets 它运行rake RAI
  • 想要设置ul的liinnerHTML

    我正在编写一个 javascript 函数 我得到一个ul来自我的 HTML 的对象并想要设置其中之一的文本li elements in theul 我正在做 list document getElementById list name 然
  • CSS:以位置显示图像:固定但允许用户缩放

    I ve created a page that scales large images to fit the window however it does not allow the user to zoom once the image
  • mongodb查询结果不带字段名

    有没有办法获取仅包含值而不包含字段名称的 mongodb 查询结果 我的查询给出了以下结果 t number 2508 t number 2560 t number 2599 理想情况下我希望查询结果是 2508 2560 2599 或者如
  • 列出 AWS SSM Parameter Store 中的所有参数

    如何列出 AWS Systems Manager SSM 参数存储中的所有参数 我正在使用 AWS CLI 我可以将它们存储为aws ssm put parameter 我可以用以下方式获取它们aws ssm get parameter 我
  • 如何使用C从文件中读取二维数组?

    I tried void read grid from file int grid const size t row const size t column FILE inf size t x y for x 0 x lt row x fo
  • 尝试使用 Terraform 创建 AWS VPC 安全组时出现循环错误

    我想创建 2 个 VPC 安全组 一台用于 VPC 的堡垒主机 一台用于私有子网 BASTION resource aws security group VPC BastionSG name VPC BastionSG descriptio
  • psql \copy 中的变量替换

    是否可以在 PSQL 控制台导出文件中将当前日期放在文件名末尾 导出的文件名应该是这样的表 20140710 csv可以动态地做到这一点吗 日期的格式可以与上面的不同 但这并不重要 这就是我的意思的例子 set curdate curren
  • Django Serializer 使用外键关系保存模型

    我正在尝试保存一个具有引用另一个表的外键的模型对象 尝试编写相同的序列化器 但是无法理解如何做到这一点 并且似乎也找不到正确的文档 我的模型对象 class Restaurant models Model name models CharF
  • 拒绝访问 .tmp 路径

    我正在尝试使用 DotNetZip 库压缩文件 我正在从文件中读取路径并将 zip 保存到该文件 但程序崩溃并抛出 这是我的代码 using ZipFile zip new ZipFile zip AddDirectory dir OUTP
  • 访问绑定源列值

    如何使用代码更新绑定源中的列值 我正在尝试类似的事情 CustomersBindingSource AddNew CustomersBindingSource Current CustomerID Guid NewGuid 此代码当前错误指
  • 在 Angular 2 中使用 SOAP 服务

    我想知道是否有人可以建议或向我指出网络上有关我的 Angular 2 应用程序如何使用 SOAP 服务的任何资源 不幸的是 这是一个遗留应用程序 因此目前没有 REST 替代方案 蒂亚 您可以查看这个 SOAP 客户端服务 https gi
  • 如何让内容占据100%的高度和宽度

    我已经很接近了 但我无法让它像我想要的那样工作 我试图让标题和菜单始终可见 并使内容占据视图屏幕的其余部分 并在溢出时拥有自己的滚动条 问题是内容的宽度没有被拉伸到右侧 并且我在页面中间出现了一个滚动条 我也无法让它占据剩余窗口高度的其余部
  • 智能指针作为多态性的类成员

    我是智能指针的新手 如果有人能给我提示我作为类成员处理智能指针的方式是否正确 我将非常感激 更准确地说 我想要实现的解决方案是在类多态性的背景下实现的 并且理想情况下应该是异常安全的 Given a 异构对象的容器 http www par
  • 来自 BLL 中的一种方法的跨多个 DAL 方法的事务

    您将如何从业务逻辑层中的一个方法调用数据访问层中的多个方法 以便所有 SQL 命令都存在于一个 SQL 事务中 每个 DAL 方法都可以从 BLL 中的其他位置单独调用 因此不能保证数据层方法始终是事务的一部分 我们需要此功能 因此如果数据