问题标签 [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 投票
2 回答
44424 浏览

c# - 使用 TransactionScope 的异常“操作对于事务的状态无效”

我们在服务器 #1 上有一个 Web 服务,在服务器 #2 上有一个数据库。Web 服务使用事务范围来产生分布式事务。一切都是正确的。

我们在服务器#3 上有另一个数据库。我们在这台服务器上遇到了一些问题,我们重新安装了操作系统和软件。我们配置了 MSDTC 并尝试使用服务器 #1 的 Web 服务与该服务器上的数据库进行通信。现在,在事务范围内的第一个 select 语句之后,我们得到:The operation is not valid for the state of the transaction。如果它使用事务范围,则此异常属于每个 Web 服务请求。服务器#2 和服务器#3 几乎相似。差异只能在设置中。在所有服务器上安装了 .NET framework 3.5 SP1 和 SQL Server SP3。

完整的堆栈跟踪:

System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction) - System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification) - System.Data.SqlClient.SqlInternalConnection.EnlistNonSqlClient. .Enlist(Transaction t × System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction) × System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) × System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) × System. Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) × 系统。Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) - System.Data.SqlClient.SqlConnection.Open() - NHibernate.Connection.DriverConnectionProvider.GetConnection() - NHibernate.Impl.SessionFactoryImpl.OpenConnection()

我搜索了此消息,但没有找到任何合适的解决方案。那么我应该检查哪些设置以及我应该做些什么来修复它?

0 投票
1 回答
193 浏览

asp.net - 我怎样才能找到导致我的交易得到提升的原因?

我有提供 Web 服务(.asmx 和 WCF 的混合物)的网站,该网站主要使用 LINQ to SQL 和 System.Transactions。有时我们会看到事务被提升为分布式事务,这会导致问题,因为我们的 Web 服务器与我们的数据库隔离,因此我们无法使用 MSDTC。

通过将以下内容添加到我的 web.config 中,我已经为 System.Transactions 配置了跟踪:

它非常有趣,并在交易被提升时向我显示,但我发现它并没有真正帮助找出原因。

ADO.NET 是否有等效的跟踪机制,可以在创建连接时向我显示,包括影响池的变量(用户、cnn 字符串、事务范围)?

0 投票
1 回答
3527 浏览

windows - Windows 7 - 启用网络 DTC 访问

我有一个 Visual Studio 2010 Windows 窗体应用程序,我在其中使用 TransactionScope 类启动事务。然后我从 Sql Server Broker Services 消息队列接收消息,它工作正常。接下来,我尝试通过调用我的数据访问层(即 Visual Studio 数据集(xsd 文件))从同一数据库调用存储过程。当我对数据库进行第二次调用时,我收到以下错误消息:

由于通信问题,MSDTC 事务管理器无法从源事务管理器中提取事务。可能的原因是:存在防火墙并且它对 MSDTC 进程没有异常,两台机器无法通过它们的 NetBIOS 名称找到彼此,或者两个事务管理器之一未启用对网络事务的支持。(来自 HRESULT 的异常:0x8004D02B)。

我在网上看到了几篇关于通过 dcomcnfg.exe 启用 DTC 访问以及允许 DTC 通过 Windows 防火墙进行通信的帖子。我已经做了这些事情,但仍然遇到这个问题。我知道我们的远程数据库服务器设置为启用 DTC 访问,因为我们在 Windows XP 和 Vista 上使用 Visual Studio 2008 构建的其他项目中使用了类似的事务。我认为 Windows 7 和 Visual Studio 2010 有一些特定的东西导致了这个问题,但一直无法找出它是什么。任何人都可以帮助解决这个问题吗?

我刚刚在网上看到另一位遇到此问题的程序员的帖子(http://www.pcreview.co.uk/forums/thread-3977150.php),他说它在 Windows 7 - x86 上运行良好,但得到了这个Windows 7 - x64 上的错误。我正在运行 Windows 7 的 x64 版本,有人知道 Windows 7 - 64 位版本上的 MSDTC 是否存在问题?

0 投票
0 回答
1981 浏览

c# - MSDTC 尝试在分布式事务中登记客户端计算机

我们看到 MSDTC 记录了以下间歇性警告:

调用方已尝试将事务传播到远程系统,但机器“X”上当前禁用了 MSDTC 网络 DTC 访问。请查看 MS DTC 配置设置。

但是,MSDTC 在机器 X 上被设计为禁用 - 它是客户端机器,并且在事务中没有征用任何业务!

  • 通过 TCP 托管 WCF 服务的多个 Windows 服务端点
  • 下面的单个 SQL Server 2005 实例
  • 链接到 Sql
  • 远程客户端通过 WCF/TCP 接收事件回调

这个问题很难重现 - 通常在重新启动服务之后。我们怀疑客户端机器的回调发生在事务的上下文中。

只是想知道是否有人见过类似的问题?

0 投票
3 回答
1147 浏览

c# - MSDTC 和具有实体框架的多个数据库

在我的代码中,我尝试使用 TransactionScope 和实体框架来使用事务。在此事务中,我们打开一个到单独服务器和数据库的常规 SQL 连接。当 conn.Open() 被调用时,我们得到一个错误:

“分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中启用 DTC 以进行网络访问。”

但是,MSDTC 已启用并在服务器上运行。

0 投票
1 回答
1218 浏览

sql-server - MSSQL2008:DTC 事务 - 内部中止

我编写了一个小的自己的复制 - 一个触发 DTC INSERT 到另一台服务器的触发器(我自己的“复制”的一个原因:触发器运行时它计算一些数据,另一个:它从快速版本到快速版本)。

当我使用 Windows 身份验证从同一主机进行初始插入时,它工作正常。但是另一台主机上有一个网络服务器,它使用 sqlserver 登录(用于测试 sa)。当此主机执行初始插入时,在 DTCTransaction EventClass(Profiler)中的登记和创建阶段之后,我得到一个内部中止。

神奇的是:当我第一次使用 Windows 身份验证从同一主机启动它时,我可以从网络服务器启动它并且它工作正常。但我只需要等待几分钟,它不会起作用。

我的推理错误在哪里?

这是我的初始服务器脚本:

更新:

我想将一些统计表从一个 sql server 导出到另一个 sql server。我写了同样的触发器来做到这一点。同时我在触发器中调用了一些额外的数据并将其写入第二个数据库,所以我不能使用标准复制。

我用这段代码创建了一个链接服务器:

EXEC master.dbo.sp_addlinkedserver @server = @Servername, @srvproduct=N'SQL Server'

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = @Servername,@locallogin = NULL,@useself = N'False',@rmtuser = @Serverlogin,@rmtpassword = @Serverpwd

我的触发器如下所示:

如果触发触发器的插入的发起者使用“windows authentification”,这将非常有用。

当我使用“sql server authentification”时出现我的问题,这是我们的 apache tomcat 网络服务器所必需的:

当我查看 SQL Server Profiler 时,DTCTransaction EventClass 返回

当我第一次运行“windows authentification”时,我可以在接下来的几分钟内成功执行插入“sql server authentification”。当我稍等一下时,会发生同样的错误。

所以我的第一个解决方案是将触发器更改为 WITH EXECUTE AS OWNER

如果我使用“sql server authentification”从本地计算机运行插入,但不能从另一台服务器运行插入,则此方法有效。但它也应该在另一台服务器上工作。

0 投票
1 回答
1026 浏览

.net - SQL Server 和 TransactionScope(使用 MSDTC):偶尔无法连接

我为调用我的 SQL Server 的 .net 代码编写了一些测试。看来 usingSystem.Transactions是回滚对数据库所做的任何修改的绝佳选择。我知道一些纯粹主义者会建议我可能想模拟数据库,但我不会走那条路;这不是严格意义上的纯单元测试。

当我编写并运行几个测试时,这完全符合预期。我只是将用于初始化和中止 .net 事务的代码放在测试设置和测试拆卸方法中。这似乎是一个很好的解决方案。

但是,我遇到的问题是,当我尝试运行 100 个这样的测试时,它们中的许多会抛出异常,即使它们在一个接一个运行时通过,它们也无法连接到 SQL Server。更糟糕的是,当我运行测试时,我的数据库中的表有时会偶尔被锁定。我必须让我的 DBA 手动移除锁。

许多人都知道,在针对 SQL 服务器的开发工作站上运行的代码(如运行此测试)上使用 TransactionScope 将使 .net 框架使用 MSDTC。

这是一个代码示例来说明我在做什么:

如您所见,这里没有什么特别花哨的。我只有一个测试方法,它将向我的数据库写入一些我希望我的方法找到的东西。这只是一个例子;还有很多其他类似的测试。

我的测试逻辑似乎是合理的。什么可能导致我的测试不仅失败,而且偶尔将用户锁定在表之外?

0 投票
1 回答
2700 浏览

sql-server - 为什么在使用 SQL Server 镜像和自动故障转移时不支持 MSDTC?

我有一个希望支持 SQL Server 镜像的应用程序。但是,当前的体系结构使得多个 WCF 服务和 DB 连接将在单个 MSDTC 事务中登记,并且 Microsoft 声明使用镜像时不支持 MSDTC。

他们的解释并没有提供非常丰富的信息:

当您将数据库镜像与 MS DTC 事务一起使用时,可能会发生类似的情况。例如,新的主体服务器在故障转移后联系 MS DTC。但是,MS DTC 不知道新的主体服务器。因此,MS DTC 会停止任何处于“准备提交”阶段的事务,即使这些事务在其他数据库中被视为已提交。

我在理解上有问题的是最后一句话。这与如果数据库服务器没有镜像,只是在同一时间点死亡有什么不同?有人可以向我解释吗?我需要能够向我组织中的其他人(以及客户)解释这一点,但我不明白为什么 MSDTC 可以在一种情况下正确回滚/补偿,但如果其中一个参与者是镜像 SQL 服务器则不能(在完全安全模式下)。

0 投票
1 回答
883 浏览

.net - 没有 MSDTC - 仍然得到“与底层事务管理器的通信失败”

在我的项目中,我使用 Ado.Net 的 DbTransaction 对象来管理事务......那么为什么我会收到与 MSDTC 相关的错误 - “与底层事务管理器的通信失败”。

这是我的代码。

0 投票
2 回答
252 浏览

sql-server - 分布式事务是在 Windows Installer 自定义操作中启用数据库升级回滚的好主意吗?

我已经超越了 WiX 中可用的 Sql Server 自定义操作,因此我采取了大胆的步骤,使用部署工具基础创建自己的操作。我想成为一个好公民,并确保我的支持回滚。但是最好的方法是什么?

我需要支持 SQL Server 2005 及更高版本的所有版本。

在我看来,问题在于 Windows Installer 分两个阶段工作:它完成工作,在执行过程中存储撤消信息。然后,当所有部分都到位时,它要么提交(删除撤消信息)要么回滚。

这意味着标准交易无法完成这项工作。它们必须在我的 Execute 自定义操作中完成,而且我以后没有机会回滚它们。

我考虑过对数据库进行仅复制备份,如果需要,我可以在回滚操作中恢复,但我认为这种方法虽然简单,但也有缺点。例如,我不知道我们的数据库会有多大——所以我不能保证目标机器上会有可用空间来保存备份。此外,备份和恢复可能需要一段时间才能完成,而且我不希望典型安装(不​​会发生回滚)过慢。

这让我想到了我目前最喜欢的想法:确保分布式事务协调器已启动,然后在进行更改之前初始化分布式事务,然后在适当的自定义操作中提交或回滚它。

看来我可以使用TransactionInterop类的成员来导出一个 cookie,使我能够在不同的自定义操作之间共享事务。

有这种事情经验的人能说一下它是否有可能奏效吗?