环回链接服务器的事务 - 锁定问题

时间:2015-10-06 15:39:47

标签: sql-server sql-server-2012 linked-server self-reference

我有两个数据库AB。它们都存储在一个数据库实例上。我在实例上创建了一个环回链接服务器。

数据库A包含一个表dbo.Users和一个存储过程更新dbo.Users表。在数据库B中,我有一个查询,它执行两项操作:

  1. 执行更新A表的数据库dbo.Users中的存储过程。
  2. dbo.Users通过链接服务器选择数据。
  3. BEGIN TRANSACTION
    EXEC [LinkedServer].A.dbo.UpdateUser
    select * from [LinkedServer].A.dbo.Users 
    ROLLBACK TRANSACTION
    

    当我尝试执行此存储过程时,只有在链接服务器上设置超时时才会出现以下异常;在其他情况下,查询没有完成:

    Msg 3971, Level 16, State 1, Line 1
    The server failed to resume the transaction. Desc:3900000002.
    

    此问题的原因是执行[LinkedServer].A.dbo.UpdateUser存储过程会创建一个不允许生成select语句的事务。

    所以我决定添加WITH (NOLOCK),如下所示:

    BEGIN TRANSACTION
    EXEC [LinkedServer].A.dbo.UpdateUser
    select * from [LinkedServer].A.dbo.Users WITH (NOLOCK)
    ROLLBACK TRANSACTION
    

    然后我得到了这个例外:

      

    链接服务器“LinkedServer”的OLE DB提供程序“SQLNCLI11”   返回消息“未指定的错误”。
    OLE DB提供程序“SQLNCLI11”   链接服务器“LinkedServer”返回消息“查询超时   已过期“。
    消息7311,级别16,状态2,行4无法获取架构   用于OLE DB提供程序“SQLNCLI11”的行集“DBSCHEMA_TABLES_INFO”   链接服务器“LinkedServer”。提供程序支持该接口,但是   使用时返回失败代码。

    我在microsoft support page上找到了有关此例外的信息。当您尝试将分布式查询从64位SQL Server客户端运行到链接的32位SQL Server时,会发生此错误。在我的情况下它没有意义,因为我有一个环回链接服务器。

    当数据库部署在单独的SQL Server实例上时,不会发生上述错误。在使用环回链接服务器时,如何省略锁定或更改T-SQL以获取异常的任何想法?

1 个答案:

答案 0 :(得分:1)

  

链接服务器“LinkedServer”的OLE DB提供程序“SQLNCLI11”   返回消息“未指定的错误”。

     

链接服务器“LinkedServer”的OLE DB提供程序“SQLNCLI11”   返回消息“查询超时已过期”。

     

消息7311,级别16,状态2,行4无法获取架构行集   用于链接的OLE DB提供程序“SQLNCLI11”的“DBSCHEMA_TABLES_INFO”   服务器“LinkedServer”。提供程序支持该接口,但是   使用时返回失败代码。

我也遇到了上面提到的错误。

如果您正在进行回送链接服务器并收到相同的错误,请检查是否应在脚本末尾写入任何使用回送服务器的SP(创建过程)。

如果使用TFS中的代码,请在部署后使用回送链接服务器编写该SP的create procedure语句。

只需按照以下任何一个步骤操作: -

  1. 在脚本末尾复制粘贴SP。
  2. 不要使用回送服务器。
  3. 如果您使用来自TFS的发布脚本,请在Post部署脚本中编写SP(在数据插入到所有表之后)。
  4. 这些解决方案对我有用。