Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么在使用SQL Server镜像时不支持MSDTC&;自动故障切换?_Sql Server_Msdtc_Failover_High Availability_Database Mirroring - Fatal编程技术网

Sql server 为什么在使用SQL Server镜像时不支持MSDTC&;自动故障切换?

Sql server 为什么在使用SQL Server镜像时不支持MSDTC&;自动故障切换?,sql-server,msdtc,failover,high-availability,database-mirroring,Sql Server,Msdtc,Failover,High Availability,Database Mirroring,我有一个支持SQL Server镜像的应用程序。但是,该体系结构目前允许在单个MSDTC事务中登记多个WCF服务和DB连接,Microsoft声明在使用镜像时不支持MSDTC 信息量不大: 在MS DTC事务中使用数据库镜像时,可能会出现类似的情况。例如,新的主体服务器在故障切换后会联系MS DTC。但是,MS DTC不知道新的主体服务器。因此,MS DTC会停止处于“准备提交”阶段的任何事务,即使这些事务被视为已在其他数据库中提交 我在理解上遇到的问题是最后一句话。这与数据库服务器没有镜像,只

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

信息量不大:

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


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

MSDTC不知道镜像。因此,当它在分布式事务中注册资源管理器时,它将通过其名称(例如服务器a)知道RM。发生故障转移后,日志将告诉新主体“联系DTC,查看事务T的状态”。新的负责人,名为服务器B,来到DTC,说“我是服务器B,事务T的结果是什么?”DTC会告诉他“走开,我不认识你,你没有注册事务T”。这也是知识库文章所描述的:

故障转移后,新主体 服务器无法连接到的MS DTC 前一个主体服务器 使用相同的资源ID。因此, 新的主体服务器无法获取 交易状态


您会问“如果DB服务器没有镜像,只是在同一时间点死掉,这与此有什么不同?”。不同之处在于,如果发生这种情况,那么当数据库恢复时,它将在同一台服务器上恢复,并且该服务器可以联系DTC并要求它回滚注册它的分布式事务

MSDTC会回滚其他资源吗?或者,分布式事务会一直等到原始服务器回来吗?在两阶段提交中,当MSDTC回避镜像伙伴(回滚?提交?抛出错误?)时,镜像伙伴会做什么?在DTC无法采取行动时,会出现一种状态:在它通知某些RM可以提交后。在那一刻,DTC无法改变其对事务结果的看法,这是发生故障转移的问题时刻。如果故障转移发生在这一刻之前,那么很简单:只要求所有其他RM回滚,没什么大不了的。因此,假设涉及3个RM。我们进入了您提到的阶段,RM1被告知提交。RM2是我们的SQL Server,由于它已故障转移,因此无法访问它。RM3怎么了?他被告知要犯罪吗?如果原始服务器再也没有回来告诉它回滚,那么这个分布式事务将保留多长时间?该事务是否已发送到镜像合作伙伴?如果有什么地方我可以去了解更多的细节,请直接告诉我。我自己在这个话题上找不到太多东西。也谢谢你的帮助!假设你只有两个RMs。RM1是发送“准备提交”,它回答“准备好”。RM2被发送为“准备提交”,它回答为“准备就绪”。交易准备就绪,第一阶段成功。RMs在回答“准备就绪”后无法改变主意。DTC继续并决定事务成功,开始通知参与者提交。它发送RM1“提交”,RM1确实提交。现在发生故障转移。DTC试图联系RM2,但处于脱机状态。RM2上的本地事务已故障转移到RM3,未登记在DTC中。现在您处于不稳定状态,DTC无法回滚,RM3无法注册。