问题标签 [msdtc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
26851 浏览

firewall - MSDTC 和防火墙

我们将 MSDTC 用于 SQL 事务。我在为 MSDTC 工作设置防火墙时遇到问题。应用程序和 SQL 在不同的机器上运行。如果我关闭应用程序服务器上的防火墙,目前 MSDTC 正在工作。我认为应该以某种方式为某些端口的防火墙设置添加例外。这样防火墙仍然可以打开,DTC 不会有任何问题。我不确定要在防火墙设置中添加的端口(我确实尝试添加端口 135 但没有成功)

0 投票
1 回答
6806 浏览

msdtc - MSDTC 中的“允许远程客户端”和“允许远程管理”是什么意思?

我正在尝试为某些生产机器配置 MSDTC,但在了解所有设置的含义时遇到了一些困难,特别是“客户端和管理”下的“允许远程客户端”和“允许远程管理”。

经过几个小时的搜索,这是我发现的:

任何有关这些设置的帮助将不胜感激。如果可能,我希望 Microsoft 链接到这些设置的文档。

0 投票
2 回答
3299 浏览

.net - 将 MSDTC 与实体框架一起使用的提供程序失败

我有一个应用程序正在保存到数据库(使用实体框架)并在一次保存中将文档保存到 Sharepoint。我正在尝试将 MSDTC 与 TransactionScope 一起使用。

我的部分 EF 插入逻辑包括将外键列表传递给数据层。该层从数据库中检索“外键”对象,然后将其添加到主对象。奇怪的是,这适用于第一个外键项目,但在第二个项目上失败,并显示以下消息。

System.Data.EntityException:基础提供程序在打开时失败。---> System.Transactions.TransactionManagerCommunicationException:分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中启用 DTC 以进行网络访问。

MSDTC 在第一次通过时启用并工作,但不是第二次。我假设当我进行多个选择调用时,上下文会以某种方式变得混乱?

这是我的逻辑:

也许我不应该从数据库中检索对象?我错过了一种简单的方法来引用 EF 中的关系吗?

0 投票
3 回答
5154 浏览

.net - .NET:如何在 System.Transactions 中禁用升级?

是否可以在不支持分布式事务的情况下使用 System.Transactions 编程模型?

就像是

0 投票
1 回答
146 浏览

sql-server - 在 Windows 7 上的 SQL Server 2008 中动态创建的分布式查询

我只是在多台服务器上进行一些统计数据收集,作为测试,我正在本地网络上使用我的机器(机器 A)和另一台机器(机器 B)。

我的机器 (A) 正在从另一台机器 (B) 收集暂存表中的所有信息。我有一个运行并动态创建如下内容的 sp:

上面所做的是从机器 B 中提取 1000 行批次所需的信息。这将循环直到检索到所有数据。

下次它使用不同的 SprocName 运行时,它实际上并没有调用机器 B,而是将 @@rowcount 视为 0 并继续前进。它只运行符合上述语句的第一个存储过程。

所以伪代码:

我以前尝试过这种方法,因为'select * from openquery([Machine B],'exec SprocName @batchsize),但这次我尝试了不同的方法。有人知道为什么 Servername 的 exec () 只想使用一个 sprocname 吗?它将循环并拉出所有行,但移动到第二个 sprocname 显然甚至不会调用机器 B。

出于性能原因,我不会使用 Servername.Table.Schema.Sproc。

一些统计数据:
机器 A - Windows 7 Sql Server 2008 SP1 未安装 CU
机器 B - Windows 2003 Sql SErver 2005 SP3 未安装 CU
两者都具有与此相关的大部分 MSDTC 选项,但 XA 事务除外。

如果有人真正理解我的问题并可以提供帮助,请提前感谢。

0 投票
3 回答
7860 浏览

.net - 关于交易和 msdtc 的混淆

我对事务和 msdtc 如何协同工作有一些基本的困惑。

我有一个基本的服务器/客户端 winforms 应用程序。该应用程序使用 transactionscope 来封装在 sql server 上执行的几个 sql 命令。

当我仅在服务器上启用 msdtc 网络访问时,该应用程序似乎工作正常。然后有一天它停止工作,说没有启用网络访问。

现在看来,我必须在客户端计算机和服务器上都启用 msdtc 网络访问才能使 transactionscope 工作。

客户端或服务器 msdtc 服务是否执行事务?或者两者兼而有之?

是否有人对客户端和服务器上是否需要 msdtc 网络访问或仅服务器有指导?

0 投票
1 回答
2765 浏览

nhibernate - NServiceBus 和 NHibernate - 消息处理程序和事务

据我了解,NServiceBus 在事务中执行 IMessageHandler 的 Handle 方法,如果异常传播出此方法,则 NServiceBus 将确保将消息放回消息队列(在错误队列之前最多 X 次)等。所以我们有一个原子操作可以这么说。

现在,如果我在我的 NServiceBus 消息句柄方法中做这样的事情

这对交易范围有什么影响?就其与 Nservicebus 事务的关系而言,trans1 现在是否算作嵌套事务,即使我们没有做任何事情来将它们结合起来?(如果不是,如何链接到 NServiceBus 的事务?

查看第二个块(trans2),如果我取消注释 throw 语句,NServiceBus 事务是否也会回滚 trans1?在基本场景中,假设我将上述内容转储到控制台应用程序中,然后 trans1 是独立的、提交、刷新并且不会回滚。我试图澄清现在我们坐在别人的交易中会发生什么,比如 NServiceBus?

以上只是示例代码,我不会直接使用会话,更像是通过 uow 模式。

0 投票
1 回答
1254 浏览

sql - MySQL 中的 MSDTC(分布式事务)支持

MySQL 是否支持 MSDTC?

0 投票
8 回答
23153 浏览

.net - ADO.NET 实体框架中的事务的 MSDTC 问题

在我们当前的项目中,我们使用 ADO.NET Entity Framework 作为应用程序的数据层。有些任务需要在事务中运行,因为在数据库中有很多工作要做。我正在使用TransactionScope来围绕这些任务。

问题是一旦我使用TransactionScope就会发生异常:

System.Data.EntityException:基础提供程序在打开时失败。---> System.Transactions.TransactionManagerCommunicationException:与底层事务管理器的通信失败。---> System.Runtime.InteropServices.COMException (0x80004005):对 COM 组件的调用已返回错误 HRESULT E_FAIL。

似乎此错误与MSDTC(Microsoft 分布式事务协调器)有关。当我更改 MSDTC 的安全配置时,会引发另一个异常:

System.Data.EntityException:基础提供程序在打开时失败。---> System.Transactions.TransactionManagerCommunicationException:分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中启用 DTC 以进行网络访问。

但是配置了 MSDTC,TransactionScope会导致错误。有人知道这里出了什么问题吗?

0 投票
7 回答
77445 浏览

c# - TransactionScope 在某些机器上自动升级到 MSDTC?

在我们的项目中,我们使用 TransactionScope 来确保我们的数据访问层在事务中执行它的操作。我们的目标是不需要在最终用户的机器上启用 MSDTC 服务。

问题是,在我们一半的开发人员机器上,我们可以在禁用 MSDTC 的情况下运行。另一半必须启用它,否则他们会收到“[SERVER] 上的 MSDTC 不可用”错误消息。

这真的让我摸不着头脑,并让我认真考虑回滚到基于 ADO.NET 事务对象的类似 TransactionScope 的自制解决方案。这看起来很疯狂 - 在我们一半开发人员的工作(并且不会升级)的相同代码确实会升级到其他开发人员的代码。

我希望有一个更好的答案来跟踪为什么交易会升级到 DTC,但不幸的是它没有。

这是会导致问题的示例代码,在尝试升级的机器上,它会尝试在第二个连接上升级。Open()(是的,当时没有其他连接打开。)

我们真的深入研究并试图解决这个问题。以下是有关它工作的机器的一些信息:

  • 开发 1:Windows 7 x64 SQL2008
  • 开发 2:Windows 7 x86 SQL2008
  • 开发 3:Windows 7 x64 SQL2005 SQL2008

它不适用于的开发人员:

  • 开发 4:Windows 7 x64,SQL2008 SQL2005
  • 开发 5:Windows Vista x86、SQL2005
  • 开发 6:Windows XP X86、SQL2005
  • 我的家用电脑:Windows Vista Home Premium、x86、SQL2005

我应该补充一点,为了解决问题,所有机器都已使用 Microsoft Update 提供的所有内容进行了全面修补。

更新1:

该 MSDN 事务升级页面指出,以下情况将导致事务升级到 DTC:

  1. 在事务中登记了至少一个不支持单阶段通知的持久资源。
  2. 事务中至少包含两个支持单阶段通知的持久资源。例如,征用单个连接不会导致事务被提升。但是,每当您打开导致数据库登记的第二个数据库连接时,System.Transactions 基础结构会检测到它是事务中的第二个持久资源,并将其升级为 MSDTC 事务。
  3. 调用将事务“编组”到不同应用程序域或不同进程的请求。例如,跨应用程序域边界的事务对象的序列化。事务对象是按值编组的,这意味着任何跨应用程序域边界(即使在同一进程中)传递它的尝试都会导致事务对象的序列化。您可以通过调用将事务作为参数的远程方法来传递事务对象,也可以尝试访问远程事务服务组件。这会序列化事务对象并导致升级,就像跨应用程序域序列化事务时一样。它正在分发,本地事务管理器不再足够。

我们没有遇到#3。#2 没有发生,因为一次只有一个连接,而且它也连接到一个“持久资源”。#1 有没有可能发生?某些 SQL2005/8 配置导致它不支持单阶段通知?

更新 2:

重新调查了一下,个人,大家的SQL Server版本——“Dev 3”居然有SQL2008,“Dev 4”其实是SQL2005。这将教会我永远不要再信任我的同事。;) 由于数据的这种变化,我很确定我们已经找到了我们的问题。我们的 SQL2008 开发人员没有遇到这个问题,因为 SQL2008 包含大量的很棒的内容,而 SQL2005 没有。

它还告诉我,因为我们将支持 SQL2005,所以我们不能像以前那样使用 TransactionScope,如果我们想使用 TransactionScope,我们将需要传递一个 SqlConnection 对象......在 SqlConnection 不能轻易传递的情况下,这似乎是有问题的……它只是闻到了 global-SqlConnection 实例的味道。座位!

更新 3

只是为了澄清问题:

SQL2008:

  • 允许单个 TransactionScope 内的多个连接(如上面的示例代码所示。)
  • 注意事项 #1:如果这多个 SqlConnections 是嵌套的,即同时打开两个或多个 SqlConnections,TransactionScope 将立即升级为 DTC。
  • 警告 #2:如果一个额外的 SqlConnection 被打开到不同的“持久资源”(即:不同的 SQL Server),它将立即升级到 DTC

SQL2005:

  • 不允许单个 TransactionScope 期间内的多个连接。当/如果打开第二个 SqlConnection 时,它将升级。

更新 4

为了使这个问题更加有用,并且为了更清楚起见,以下是如何让 SQL2005 升级为 DTC 的方法 SqlConnection

这对我来说似乎很糟糕,但我想我可以理解是否每次调用SqlConnection.Open()都是从连接池中获取的。

“不过,为什么会发生这种情况呢?” 好吧,如果您在打开该连接之前对它使用 SqlTableAdapter,则 SqlTableAdapter 将打开和关闭连接,从而有效地为您完成事务,因为您现在无法重新打开它。

因此,基本上,为了成功使用 SQL2005 的 TransactionScope,您需要有某种全局连接对象,该对象从第一个 TransactionScope 实例化的那一刻起保持打开状态,直到不再需要它为止。除了全局连接对象的代码异味之外,先打开连接后关闭它与尽可能晚打开连接并尽快关闭它的逻辑相矛盾。