ALTER / CREATE在事务中阻塞并使用环回链接服务器

时间:2019-02-18 19:27:20

标签: sql-server sql-server-2008-r2

使用SQL Server 2008 R2 SP3,已应用最新的安全包。

下面的代码是SQL Compare部署脚本的简化/修改部分。我更改了一些名称,但是此代码在SSMS中运行时将其锁定。

要注意的关键事项:

  • 需要第一台ProcABC。如果不存在,一切运行正常。
  • 链接服务器是回送服务器,但它是实例。它的数据源是“。\ SomeInstance”。链接的服务器设置为:
    • 数据访问:正确
    • RPC和RPC Out:正确
    • 使用远程排序规则:正确
    • 其他所有东西都是假的。
  • 问题似乎仅在于回送服务器(即使我使用IP而不是使用“。”创建它)也是如此。

症状是脚本刚刚停止。它没有被阻止。它只是停止。

在试图调用sys.sp_check_constbytable_rowset的脚本SPID上阻止了第二个SPID。

唯一的恢复是杀死脚本SPID,然后杀死第二个SPID。杀死第一个,仅使其处于“已杀死/回滚”状态,直到杀死第二个。仅杀死第二个SPID会导致生成一个新的SPID(也会阻塞并调用同一例程)。

我尝试更改所有SET设置。消除封闭的事务也可以解决此问题,但这不是可用的解决方案。

有什么想法吗?

SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL Read committed
GO
BEGIN TRANSACTION
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Altering [dbo].[ProcABC]'
GO
CREATE PROCEDURE [dbo].[ProcABC]
AS
BEGIN

SET NOCOUNT ON

END

GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Altering [dbo].[FunctionABC]'
GO
CREATE FUNCTION [dbo].[FunctionABC] ()
RETURNS @ReturnTable TABLE
(
  ID   int,
  Name varchar(50)
)
AS
BEGIN

INSERT INTO @ReturnTable (ID, Name)
    SELECT ID, Name
    FROM LoopedBackLinkedServer.SomeDB.dbo.SomeTable

RETURN

END
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
COMMIT TRANSACTION
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
DECLARE @Success AS BIT
SET @Success = 1
SET NOEXEC OFF
IF (@Success = 1) PRINT 'The database update succeeded'
ELSE BEGIN
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION
    PRINT 'The database update failed'
END
GO

0 个答案:

没有答案