标签: msdtc

关于交易和msdtc的混淆

关于事务和msdtc如何协同工作,我有一些基本的困惑.

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

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

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

客户端或服务器msdtc服务是否可以进行事务处理?或者两者兼而有之?

有没有人有关于客户端和服务器或服务器上是否需要msdtc网络访问的指导?

.net msdtc transactions winforms

9
推荐指数
2
解决办法
7295
查看次数

如何确定分布式事务超时的原因

我正在使用LINQ to SQL和支持分布式事务的第三方SDK.当我意识到挂起的更新将更新第三方SDK中的SQL记录和记录时,我正在创建一个具有0(可能是无限的)超时的TransactionScope(尽管我还尝试了12小时作为时间跨度参数).然后我在环境事务(由transactionscope创建)上使用GetDtcTransaction来获取DTC事务以链接到第三方SDK.事情很好地工作了大约10分钟,但在10分钟后,事务消失并发生错误.如何确定交易消失的原因.我怀疑这是暂停,因为它经常在10分钟后发生,即使在那时已经完成了稍微不同程度的工作.但我对如何确定终止交易的原因,原因以及如何延长其生命感到茫然.

我尝试使用SQL事件探查器跟踪以下事件:

  1. 所有错误和警告事件
  2. 除"审核模式对象"事件之外的所有安全事件
  3. 除SQLTransaction和TransactionLog事件之外的所有Transaction事件

所有我在错误发生时都会遇到以下事件:

<Event id="19" name="DTCTransaction">
  <Column id="3" name="DatabaseID">1</Column>
  <Column id="11" name="LoginName">sa</Column>
  <Column id="35" name="DatabaseName">master</Column>
  <Column id="51" name="EventSequence">167065</Column>
  <Column id="12" name="SPID">10</Column>
  <Column id="60" name="IsSystem">1</Column>
  <Column id="1" name="TextData">{D662BBC4-21EC-436D-991C-DCB061A34782}</Column>
  <Column id="21" name="EventSubClass">16</Column>
  <Column id="25" name="IntegerData">0</Column>
  <Column id="41" name="LoginSid">01</Column>
  <Column id="49" name="RequestID">0</Column>
  <Column id="2" name="BinaryData">C4BB62D6EC216D43991CDCB061A34782</Column>
  <Column id="14" name="StartTime">2009-11-11T13:55:32.82-06:00</Column>
  <Column id="26" name="ServerName">.</Column>
  <Column id="50" name="XactSequence">0</Column>
</Event>
<Event id="33" name="Exception">
  <Column id="3" name="DatabaseID">9</Column>
  <Column id="11" name="LoginName">sa</Column>
  <Column id="31" name="Error">1222</Column>
  <Column id="35" name="DatabaseName">ACS</Column>
  <Column id="51" name="EventSequence">167066</Column>
  <Column id="12" name="SPID">19</Column>
  <Column id="20" …
Run Code Online (Sandbox Code Playgroud)

.net vb.net msdtc sql-server-2005 linq-to-sql

8
推荐指数
1
解决办法
4005
查看次数

Dtcping测试通过但仍然与底层事务管理器的通信失败

DTCPing工具说一切都应该没问题.实际的例外是:

System.Transactions.TransactionManagerCommunicationException:
Run Code Online (Sandbox Code Playgroud)

与底层事务管理器的通信失败.---> System.Runtime.InteropServices.COMException:由于通信问题,MSDTC事务管理器无法将事务推送到目标事务管理器.可能的原因是:存在防火墙且MSDTC进程没有例外,两台计算机无法通过其NetBIOS名称找到对方,或者两个事务管理器之一未启用对网络事务的支持.(HRESULT异常:0x8004D02A)

该服务在VM上运行.其他服务器能够运行分布式事务,因此正确配置了DB框.

c# sql-server msdtc transactions transactionscope

8
推荐指数
1
解决办法
7508
查看次数

如何检测到发生回滚?

我正在寻找一个大型业务应用程序中的一个错误,该错误中的业务流程失败了,但是部分持久化到了数据库中。为了使问题更难弄清,该过程每隔几周就会失败一次,每次失败之间都会成功处理数十万次。当并发性/工作进程数增加时,错误频率似乎会增加。

到目前为止,我们已经能够重新创建该程序所看到的内容。(.NET 4.7.1框架)

using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    using (var sqlConnection = new SqlConnection("Server=localhost;Database=Database1;Trusted_Connection=True"))
    {
        sqlConnection.Open();

        // Doing some unwanted nested manual transaction and rolling it back
        var transaction = sqlConnection.BeginTransaction();
        new SqlCommand($"INSERT INTO TestTable VALUES('This will be rolled back}')", sqlConnection).ExecuteNonQuery();

        transaction.Rollback();

        // Now doing some work with the DB.
        // You might expect it to become a part of transactionScope, but that is NOT the case!
        // So this command will actually succeed, with data written to …
Run Code Online (Sandbox Code Playgroud)

c# sql-server msdtc

8
推荐指数
1
解决办法
126
查看次数

分布式事务:.NET Framework 与 .NET Core

我有以下代码示例:

static void Main(string[] args)
{
    TransactionManager.DistributedTransactionStarted += (sender, eventArgs) =>
    {
        Console.WriteLine("Promoted to distributed transaction!");
    };
?
    const string connectionString = @"Server=localhost\SQLEXPRESS;Database=master;Integrated Security=true;";
?
    using (var tx = new TransactionScope())
    using (var conn1 = new SqlConnection(connectionString))
    using (var conn2 = new SqlConnection(connectionString))
    {
        conn1.Open();
        Console.WriteLine("conn1 opened");
?
        conn2.Open();
        Console.WriteLine("conn2 opened");
?
        tx.Complete();
    }
?
    Console.ReadLine();
?
}
Run Code Online (Sandbox Code Playgroud)

在 .NET Framework (4.8) 控制台应用程序(针对 SQL Server Express 2017)中执行此代码时,会产生以下输出:

.NET Framework 控制台中的代码输出

由于事务被提升为分布式事务,我希望一个类似的面向 .NET Core (3.0) 的控制台应用程序会抛出一个

System.PlatformNotSupportedException(此平台不支持分布式事务。)。

但是,实际输出是:

.NET Core 控制台中的代码输出

为什么是这样?我希望将事务提升为分布式事务是与框架无关的。


编辑:这个 .NET …

.net c# sql-server msdtc .net-core

8
推荐指数
1
解决办法
4636
查看次数

DTCPing和DTCTester有什么区别?

我之前使用过DTCTester来诊断MSDTC问题.但是,我只是注意到DTCPing似乎做了同样的事情.这两者有什么区别?

据我所知,到目前为止,DTCPing需要在客户端和服务器上运行,而DTCTester只需要从客户端运行.还有其他差异吗?

windows msdtc transactions

7
推荐指数
1
解决办法
8015
查看次数

调试时确定事务是否为DTC事务

在.Net中,有没有办法在调试时确定环境事务是否是DTC事务.我调查了SqlConnection类成员,但我什么都没发现.谢谢.

msdtc transactions

7
推荐指数
1
解决办法
1513
查看次数

绑定到群集MSMQ实例的MSMQ消息卡在传出队列中

我们已经为一组NServiceBus服务聚集了MSMQ,一切都运行良好,直到它没有.一台服务器上的传出队列开始填满,很快整个系统都挂起了.

更多细节:

我们在服务器N1和N2之间有一个集群MSMQ.其他群集资源只是作为本地(即NServiceBus分发服务器)直接在群集队列上运行的服务.

所有工作进程都位于不同的服务器上,即Services3和Services4.

对于那些不熟悉NServiceBus的人来说,工作会进入由经销商管理的集群工作队列.Service3和Services4上的工作程序应用程序将"我准备工作"消息发送到由同一分发服务器管理的集群控制队列,并且分发服务器通过将一个工作单元发送到工作进程的输入队列来响应.

在某些时候,这个过程可以完全挂起.下面是系统挂起时集群MSMQ实例上的传出队列的图片:

在洪州的群集MSMQ传出队列

如果我将群集故障转移到另一个节点,就像整个系统在裤子中得到了一些好处.以下是故障转移后不久的同一群集MSMQ实例的图片:

故障转移后的群集MSMQ传出队列

任何人都可以解释这种行为,以及我可以做些什么来避免它,以保持系统平稳运行?

msdtc msmq nservicebus message-queue cluster-computing

7
推荐指数
1
解决办法
2691
查看次数

MSDTC例外

我的申请一次出现以下异常,

无法从服务器获取服务器的分布式事务协调器的地址.是否在服务器上启用了DTC?

现在我需要捕获并处理异常,但无法重现异常.任何人都可以提供有关如何重现异常或提供异常类型/错误代码的输入.

由于我没有得到异常日志,因此我无法获得异常类型/错误代码.

编辑

我尝试了以下方案,

  1. 场景 - DTC服务停止时错误消息

    "服务器'MyServ\SQL2005'上的MSDTC不可用." -

  2. 场景 - 在DATABASE SERVER错误消息中禁用DTC的网络访问时

    "合作伙伴事务管理器已禁用其对远程/网络事务的支持."

  3. 场景 - 在应用程序服务器错误消息中为DTC禁用网络访问时

    "事务管理器已禁用其对远程/网络事务的支持."

  4. 还尝试通过停止app server/webserver中的netbios,然后我收到以下错误,

    由于通信问题,MSDTC事务管理器无法从源事务管理器中提取事务.可能的原因是:有防火墙,它并没有对MSDTC过程异常,在两台计算机无法通过其NetBIOS名称找到对方,或者对于网络交易的支持不是两个事务管理器中启用了.

还试用了Stoppin SQL Server和MSDTC服务.然后在启动MSDTC之前启动SQL服务器.但无法重现我需要的错误消息.

.net sql-server msdtc

7
推荐指数
1
解决办法
1356
查看次数

消息7391:链接服务器无法启动分布式事务(两个svrs在本地运行)

我在Win 10 PC上运行了从SqlServer 2014到MySQL 5.7.3的LinkedServer.select和insert查询都可以通过openquery单独工作,但insert查询不会在触发器中起作用.除非您找到下面未列出的"治疗方法",否则请不要将其标记为副本!

用于链接服务器"MYSQL"的OLE DB提供程序"MSDASQL"返回消息"[MySQL] [ODBC 5.3(w)驱动程序]不支持可选功能".

*消息7391,级别16,状态2,过程TRG_AfterEventInsert,第14行

无法执行该操作,因为链接服务器"MYSQL"的OLE DB提供程序"MSDASQL"无法启动分布式事务.

有很多帖子,但我已经做了我能找到的一切,但仍然无法奏效.我找到了一个名为dtcping的MS实用程序,它首先失败,直到我翻转了注册表设置,但现在它成功了.

在DTC属性屏幕上,我启用了网络DTC管理,允许远程,允许输入/出站而无需身份验证和启用XA事务.在我的链接服务器上,我有rpc&rpc out = true和"启用DT的促销"错误.我将msdtc应用程序添加到防火墙排除项中.

我也尝试为我的LinkedServer禁用DTC,但这不起作用.我仍然得到错误.

有人可以建议调试措施吗?我花了将近一整天没有成功.MySQL驱动程序是5.3(32位).

更新:dtcPing运行没有错误,但是当我尝试触发器插入时,我在dtctrace.log中看到以下内容

TRANSACTION_BEGUN RM_ENLISTED_IN_TRANSACTION"资源管理器#1001作为交易登记#1登记.RM guid ='57c2b4b4-f37a-4017-a1fc-2d95bd64693d'"

RECEIVED_ABORT_REQUEST_FROM_BEGINNER"收到了从初学者中止交易的请求"

TRANSACTION_ABORTING"交易正在中止"

mysql sql-server msdtc

7
推荐指数
1
解决办法
815
查看次数