在一个StoredProcedure中,我使用链接服务器在另一个DB中进行一些插入/更新。已将代码包装在事务中。
CREATE PROCEDURE [mySchema].[mySP] (paramList)
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT OFF;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
DECLARE @TranStarted AS BIT = 0;
BEGIN TRY
IF @@TRANCOUNT = 0
BEGIN
BEGIN TRANSACTION;
SET @TranStarted = 1;
END
-- Do some stuff with linked server (inserts and updates on another server)
IF @TranStarted = 1
BEGIN
COMMIT TRANSACTION;
END
END TRY
BEGIN CATCH
IF @TranStarted = 1
BEGIN
ROLLBACK TRANSACTION;
END
PRINT 'ERROR_NUMBER: ' + CAST(ERROR_NUMBER() AS NVARCHAR(10));
PRINT 'ERROR_MESSAGE: ' + ERROR_MESSAGE();
PRINT 'ERROR_SEVERITY: ' + CAST(ERROR_SEVERITY() AS NVARCHAR(2));
PRINT 'ERROR_STATE: ' + CAST(ERROR_STATE() AS NVARCHAR(3));
PRINT 'ERROR_PROCEDURE: ' + ERROR_PROCEDURE();
PRINT 'ERROR_LINE: ' + CAST(ERROR_LINE() AS NVARCHAR(5));
END CATCH
END
结果如下:
ERROR_NUMBER: 3910
ERROR_MESSAGE: Transaction context in use by another session.
ERROR_SEVERITY: 16
ERROR_STATE: 2
ERROR_LINE: 1
我见过这个: Related track但我认为我没有任何环回链接服务器
StoredProcedure在没有事务阻止的情况下正常工作。
非常感谢任何帮助。
答案 0 :(得分:1)
这可能不适合您的情况,但万一它确实适合您或其他人......
我在使用引用同一SQL服务器上的链接服务器并且包含";MultipleActiveResultSets=true"
的连接字符串的触发器更新表时遇到“事务上下文正在使用...”错误。我正在为需要的功能添加脚本的应用程序。
但是,如果我使用不带MultipleActiveResultSets
的连接字符串,则应用程序能够成功更新表。在我们的PROD环境中,链接服务器连接到不同的服务器,但在我们的DEV环境中,它链接回同一服务器。将MultipleActiveResultSets
设置为true时,SQL Server将尝试创建分布式事务并失败,因为它是一个环回(很多帖子已指示DTC不支持)。
将MultipleActiveResultSets设置为false(或从连接字符串中删除),SQL Server没有环回问题。