错误 - 具有多个数据库连接的 LINQ/TransactionScope

2024-04-19

我正在花费大量时间将几个事务包装到同一 SQL Server 上的 2 个不同数据库。我最初在网络 DTC 访问方面遇到问题,我解决了这个问题。现在,我继续收到的错误是“与底层事务管理器的通信失败”。

我们的数据库中有一些客户资料,当这些资料过时时,我们希望将它们移至“存档”数据库进行存储。此举很简单(斜体为幽默)将它们添加到存档数据库并从主/实时数据库中删除它们。我为每个数据库都有一个 DataContext。下面的代码执行添加操作,然后在尝试使用第二个 DataContext 时在删除操作上出现错误。我使用 LINQ 才几个月,过去几天我一直在浏览文章。我想知道我的代码是否有问题,或者是否仍有某些内容未正确配置 DTC 或 ???

我们的工作站和服务器在 VMware 上运行。 - 工作站是Windows 7 SP1 - 服务器是Windows和SQL Server 2008R2

“移动”的惯例:

private int MoveProfileToArchiveDB( int iProfileId )
{
    int rc = RC.UnknownError;

    // get new Archive profile object
    ProfileArchive.ProfileInfo piArchive = new ProfileArchive.ProfileInfo();

    // 'Live' DataContext
    using ( ProfileDataContext dbLive = new ProfileDataContext() )
    {
        // get Live profile
        ProfileInfo piLive = ProfileInfo.GetProfile( dbLive, iProfileId );

        // copy Live data to Archive profile object... including the id
        ProfileArchive.ProfileInfo.CopyFromLive( piLive, piArchive, true );
    }

    bool bArchiveProfileExists = ProfileArchive.ProfileInfo.ProfileExists( piArchive.id );

    // make the move a transaction... 
    using ( TransactionScope ts = new TransactionScope() )
    {
        // Add/Update to Archive db
        using ( ProfileArchiveDataContext dbArchive = new ProfileArchiveDataContext() )
        {
            // if this profile already exists in the Archive db...
            if ( bArchiveProfileExists )
            {
                // update the personal profile in Archive db
                rc = ProfileArchive.ProfileInfo.UpdateProfile( dbArchive, piArchive );
            }
            else
            {
                // add this personal profile to the archive db
                int iArchiveId = 0;
                piArchive.ArchiveDate = DateTime.Now;
                rc = ProfileArchive.ProfileInfo.AddProfile( dbArchive, piArchive, ref iArchiveId );
            }

            // if Add/Update was successful...
            if ( rc == RC.Success )
            {
                // Delete from the Live db
                using ( ProfileDataContext dbLive = new ProfileDataContext() )
                {
                    // delete the personal profile from the Profile DB
                    rc = ProfileInfo.DeleteProfileExecCmd( dbLive, iProfileId );    // *** ERROR HERE ***
                    if ( rc == RC.Success )
                    {
                        // Transaction End (completed)
                        ts.Complete();
                    }
                }
            }
        }

    }

    return rc;
}

NOTES:

  1. 我有几种不同的删除方法,它们都在 TransactionScope 之外工作。
  2. ProfileInfo 是主要的配置文件表,对于实时数据库和存档数据库大致相同。

任何帮助是极大的赞赏!非常感谢...


我决定将其作为答案发布,而不是继续纵横交错的评论。

  • 不要使用错误代码。这就是例外的用途。代码流更难以阅读,并且错误代码返回邀请被忽略。异常使代码更易于阅读并且更不易出错。

  • 如果您使用 TransactionScope,请记住始终显式设置隔离级别。看使用 new TransactionScope() 被认为是有害的 https://learn.microsoft.com/en-us/archive/blogs/dbrowne/using-new-transactionscope-considered-harmful。 SERIALIZABLE 的隐式隔离级别几乎从不被需要,并且会产生巨大的负面规模影响。

  • 交易升级。每当在事务范围内打开多个连接时,它们就可以将事务升级为分布式事务。行为因版本而异,有些人试图记录它,例如。TransactionScope:事务升级行为 http://pieterderycke.wordpress.com/2012/01/22/transactionscope-transaction-escalation-behavior/:

SQL Server 2008 比 SQL Server 2005 更加智能,并且可以 自动检测是否所有数据库连接都在某个 事务指向同一个物理数据库。如果是这样的话, 该事务仍然是本地事务并且不会升级为 分布式事务。不幸的是,有一些警告:

  • 如果打开的数据库连接是嵌套的,事务仍然是 升级为分布式事务。
  • 如果在交易中, 连接到另一个持久资源,事务是 立即升级为分布式事务。

由于您的连接(来自所使用的两个数据上下文)指向不同的数据库,因此即使在 SQL Server 2008 上,您的 TransactionScope 也会升级为分布式事务。

将您的应用程序纳入 DTC 至少在两个方面是有害的:

  • 吞吐量将通过地板下沉。数据库每秒可以支持几千个本地事务,但每秒只能支持数十个(可能是数百个)分布式事务。这主要是因为其复杂性两阶段提交 http://en.wikipedia.org/wiki/Two-phase_commit_protocol.
  • DTC 需要一个协调员:MSDTC。 [MSDTC 的安全增强功能] 使配置更具挑战性,开发人员发现他们的应用程序需要 MSDTC 肯定是出乎意料的。链接的文章中描述的步骤可能是您现在缺少的。对于 Windows Vista/Windows 7/Windows Server 2008/Windows Server 2008R2,步骤如下所述Windows Vista 和 Windows Server 2008 中的 MSDTC http://blogs.msdn.com/b/chrisforster/archive/2008/02/19/msdtc-in-windows-vista-and-windows-server-2008.aspx, in 如何在 Windows 2008 上配置 DTC http://itknowledgeexchange.techtarget.com/sql-server/how-to-configure-dtc-on-windows-2008/以及其他类似的文章。

现在,如果您按照上述文章修复 MSDTC 通信,您的代码应该可以工作,但我仍然相信此归档应该not发生在运行 EF 的客户端代码中。有更好的工具,SSIS http://msdn.microsoft.com/en-us/library/ms141026.aspx就是一个很好的例子。每晚运行 SSIS 的计划作业将更有效地传输那些未使用的配置文件。

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

错误 - 具有多个数据库连接的 LINQ/TransactionScope 的相关文章

  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 为什么我的 CASE 语句要求 THEN 部分的数据类型为 INT?

    我正在尝试运行一个查询 其中以下 CASE 语句是其中一行 我正在使用报表生成器 3 0 但是 我收到一条错误消息 将 varchar 值 Case 1 转换为 int 数据类型时转换失败 Microsoft SQL Server 错误 2
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何跨多个表强制执行 CHECK 约束

    我有一个在 Microsoft SQL Server 2012 Express 中记录奶牛繁殖信息的数据库 显然 一头牛只有在出生后才能配种 并且在其一生中可能会配种多次 我需要在我的数据库中强制执行这些约束 我目前已经根据下图安排了一个架
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • OpenCV GPU Farneback 光流在多线程中表现不佳

    我的应用程序使用 Opencv GPU 类gpu FarnebackOpticalFlow计算输入视频的一对连续帧之间的光流 为了加速该过程 我利用 OpenCV 的 TBB 支持在多线程中运行该方法 然而 多线程性能并不像单线程那样 为了
  • 如何在 iOS 中检查产品是否已使用应用内购买进行购买?

    我有一个应用程序集成在其中的应用程序 在我的应用程序中 我有两个用于付费应用程序购买和订阅的按钮 当用户点击 购买 时 它会检查苹果验证并购买产品 这可以正常工作 但是当购买产品时 我的购买按钮应该更改为 完成 并且当应用程序下次运行时 该
  • 同时对两个 arrayList 进行排序

    假设我有两个 ArrayList name Four Three One Two num 4 3 1 2 如果我这样做 Arrays sort num 那么我有 name Four Three One Two num 1 2 3 4 有什么
  • 撤消 git merge 到远程分支

    长话短说 我正在处理一个远程分支 my remote branch 但它在 CI 中的一些测试失败了 我被告知要重新建立 master 来解决这个问题 我做了以下事情 git checkout master git pull git che
  • R:用 gsub 替换“+”字符

    这个问题似乎完全微不足道 但我不明白为什么它不起作用 我只是想将涉及 运算符的字符变量替换为不包括 运算符的单个值 由于某种原因 gsub 和 sub 函数替换了数值但保留了运算符 关于如何克服这个问题有任何提示吗 非常感谢 data lt
  • 是否可以列出已集成到工作区的变更列表?

    实际上 是否可以获得已集成到工作区但未提交的更改列表的列表 关于什么p4 resolved 它不会告诉您确切的更改列表 但它会告诉您哪些文件版本 然后可以很容易地追溯到更改列表
  • Django Reverse 未找到参数“()”和关键字参数“{}”

    嗨 我有一个令人恼火的问题 我有一个像这样的网址模式 mproject myapp urls py url r project P
  • 如何设置visionOS中WindowGroup的大小?

    我想设置 a 的尺寸WindowGroup在visionOS上运行时为特定大小 在 iOS 和 maOS 上我们有 defaultSize对此的修饰符 当为visionOS构建时 Xcode提供了一个稍微不同的修饰符 带有一个称为深度的附加
  • 选择不同的返回重复项

    我有以下查询 SELECT DISTINCT TK TICKETID TK DESCRIPTION TK CREATIONDATE TK REPORTEDBY TK OWNER WF ASSIGNCODE FROM ticket TK IN
  • 如何在c#中创建一个完美的Singleton类?

    我想用 Singleton 类存储一些数据 据我研究 单例类只能实例化一次 但这对我不起作用 有人可以更正我的代码吗 public class MvcApplication System Web HttpApplication Single
  • 在 Android 中从 Mp3 检索元数据的最佳方法

    我一直在为 Android 开发一个小型媒体播放器应用程序 我在从音乐文件检索元数据时遇到一些问题 我一直在使用媒体元数据检索器 但事实证明这是相当麻烦的 有谁知道更好的方法来解决这个问题 如果是这样 如何实现这样的方法 我用过JAudio
  • 帕斯卡套接字

    如何在 Pascal 中使用网络套接字 这是一个来自的例子http www bastisoft de programmierung pascal pasinet html http www bastisoft de programmieru
  • 滚动事件监听器:空 While 循环,它是如何工作的以及为什么?

    这个问题是参考这个帖子 https stackoverflow com questions 52025615 vanilla js change active state of links when scrolling refactorin
  • 使用 .htaccess 重定向主域但不重定向某些子域

    目前我有 Redirect 302 http www example com 虽然我仍然希望发生此重定向 但如果他们说 我不希望它重定向他们foo mydomain com或该子域上的任何其他页面 我怎样才能做到这一点 要以这种方式更具体
  • C++ 将类插入映射容器

    我有一个 C 地图 我希望输入我的类作为值 并输入一个字符串作为键 当我尝试这样做时 出现错误 Scene Branding illegal use of this type as an expression我非法使用这种类型作为表达式 但
  • 如何从我的 Flutter 应用程序中打开 Linkedin 应用程序的个人资料?

    我想从我的 flutter 应用程序中打开 LinkedIn 用户个人资料详细信息 尝试下面的代码希望对您有帮助 你必须使用网址启动器包裹来自here https pub dev packages url launcher在 pubspec
  • NuGet 崩溃 VS2010 Ultimate

    NuGet 包管理器使我的 VS2010 Ultimate 崩溃 有谁之前经历过这个吗 我卸载了扩展并重新安装 当我打开包管理器时 会弹出以下对话框 Microsoft Visual Studio 遇到问题 需要关闭 我正在运行 NuGet
  • 管理MPAndroidChart的某些Situation PieChart中的文本

    我尝试在 MPAndroidChart 的 PieChart 中管理文本 但是当我的文本是困难的情况 如 True 2 False 3 Not 95 时 在这种情况下我的饼图布局非常糟糕 这是我的代码 fun setupPieChartVi
  • 为什么我在polymer.dart 元素上遇到类型错误?

    我有一些代码 main dart void main initPolymer var view new ChatAppConsumer chat app dart CustomTag chat app class ChatApp exten
  • 错误 - 具有多个数据库连接的 LINQ/TransactionScope

    我正在花费大量时间将几个事务包装到同一 SQL Server 上的 2 个不同数据库 我最初在网络 DTC 访问方面遇到问题 我解决了这个问题 现在 我继续收到的错误是 与底层事务管理器的通信失败 我们的数据库中有一些客户资料 当这些资料过