gpt4 book ai didi

sql-server - BEGIN TRY/CATCH 和 MSDTC 错误

转载 作者:行者123 更新时间:2023-12-02 07:57:47 27 4
gpt4 key购买 nike

1/以下代码片段显示了预期的错误:INSERT 语句与 FOREIGN KEY 约束 FK_ 冲突...

SET XACT_ABORT ON;

BEGIN TRANSACTION

INSERT INTO linkedsrv1.db1.[dbo].tbl1 ([Col1], [Col2])
VALUES (1200, 0)

COMMIT TRANSACTION

2/但是当我把它放在 BEGIN TRY/CATCH 中时,错误消息很模糊: Msg 1206, Level 18, State 118, Line 18Microsoft 分布式事务协调器 (MS DTC) 已取消分布式事务。

SET XACT_ABORT ON;

BEGIN TRY
BEGIN TRANSACTION

-- Error is on this line
INSERT INTO linkedsrv1.db1.[dbo].tbl1 ([IdWebsite], [IdProductType])
VALUES (1200, 0)

COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT 'Error' -- Code not reached

SELECT ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE()

IF XACT_STATE() != 0
ROLLBACK TRANSACTION
END CATCH

知道为什么会发生这种情况吗?

稍后编辑:

  1. 如果我删除不需要的显式事务,它就会起作用。目前还不清楚为什么当我输入 BEGIN/COMMIT TRAN 时会出现此错误。

  2. 如果我在链接服务器上的多个表中进行多次插入,我会收到相同的错误。

欢迎任何评论/评论。

最佳答案

来自 MSDN:

症状

考虑以下场景。您可以使用 SQL Server 2005 中的 SQL Native Client OLE DB 提供程序 (SQLNCLI) 创建链接服务器。您创建一个分布式事务。分布式事务包含使用链接服务器从表中检索数据的查询。当您提交分布式事务时,您可能会收到以下错误消息:

Msg 1206, Level 18, State 167, Line 3 
The Microsoft Distributed Transaction Coordinator (MS DTC) has cancelled
the distributed transaction.

此外,发生此行为后运行查询时,您可能会收到以下错误消息:

Msg 8525, Level 16, State 1, Line 1 
Distributed transaction completed. Either enlist this session in a new
transaction or the NULL transaction.

如果满足以下条件,则会出现此问题:

You use the SQLNCLI provider to create a linked server between two 
instances of SQL Server 2005.

The XACT_ABORT option is set to ON.

In the distributed transaction, you try to release a rowset before
all rows in the rowset are processed.

注意如果您在应用程序中提交分布式事务之前调用分布式事务中的 ReleaseRows 方法来释放行集,也可能会出现此问题。

原因

出现此问题的原因是 SQLNCLI 提供程序错误地向链接服务器发送注意信号以回滚分布式事务。

解决方法

为了防止 SQLNCLI 提供程序向服务器发送注意信号,请使用 SQLNCLI 提供程序完全使用 OLE DB 使用者创建的所有行集。

更新

您需要在服务器参数中将“remote proc trans”配置为“1”。

例如:

exec sp_configure '远程过程传输','1'重新配置并覆盖

这将允许您执行任何分布式查询。

更多更新

如果你也在前端使用.Net框架,那么我认为你可以使用 TransactionScope类(class)。从查询中删除事务并将事务置于代码级别。

关于sql-server - BEGIN TRY/CATCH 和 MSDTC 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20994413/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com