我正在SQL Server2008上工作,并且正在尝试执行一个存储过程,该存储过程更新一个表并在链接服务器上执行另一个存储过程。
关键是它在没有更新的情况下工作,就像这样:
Server1上的test_DTC
CREATE PROCEDURE [dbo].[test_DTC]
@UserId int,
@Status tinyint
AS
BEGIN
EXEC [Server2].[Database].[dbo].[test_DTC];
END
GOServer2上的test_DTC
CREATE PROCEDURE [dbo].[test_DTC]
AS
BEGIN
PRINT 'Done'
END
GO在Server1上执行:
EXEC [test_DTC]结果:
Done但是当我在Server1过程中包含更新时,它失败了。
Server1上的test_DTC
CREATE PROCEDURE [dbo].[test_DTC]
@UserId int,
@Status tinyint
AS
BEGIN
UPDATE
Users
SET
Status=@Status
WHERE
UserId=@UserId;
EXEC [Server2].[Database].[dbo].[test_DTC];
END
GOServer2上的test_DTC
CREATE PROCEDURE [dbo].[test_DTC]
AS
BEGIN
PRINT 'Done'
END
GO在Server1上执行:
EXEC [test_DTC]结果
Provider OLE DB "SQLNCLI10" from linked server "[Server2]" returned message "The transaction has already been implicitly or explicitly committed". Msg 7391, Level16, State 2, Procedure [Server2].[Database].[dbo].[test_DTC], Line 19
The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "Server2" was unable to begin a distributed transaction.谢谢你的帮忙
发布于 2017-11-08 16:36:12
我已经找到了一个解决方案,那就是MSDN Blog
上面写着
的原因是,当事务从一台计算机传播到另一台计算机时,它们包括它们的计算机名/DNS名。当它到达另一台计算机时,它将使用此名称尝试与发起方计算机通信。如果此通信失败,则分布式事务将无法在系统中工作。
微软已经在同一个平台上提供了Detailed Article
https://stackoverflow.com/questions/47174883
复制相似问题