【问题标题】:Transaction context in use by another session另一个会话正在使用的事务上下文
【发布时间】:2012-05-22 14:54:25
【问题描述】:

我有一个名为MyTable 的表,我在其上定义了一个触发器,如下所示:

CREATE TRIGGER dbo.trg_Ins_MyTable
   ON  dbo.MyTable 
   FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    insert SomeLinkedSrv.Catalog.dbo.OtherTable 
        (MyTableId, IsProcessing, ModifiedOn)
    values (-1, 0, GETUTCDATE())
END
GO

每当我尝试在 MyTable 中插入一行时,我都会收到以下错误消息:

消息 3910,第 16 级,状态 2,第 1 行 另一个会话正在使用事务上下文。

我已将 SomeLinkedSrv 正确定义为链接服务器(例如,select * from SomeLinkedSrv.Catalog.dbo.OtherTable 工作正常)。

如何避免错误并成功插入记录+执行触发器?

【问题讨论】:

  • SomeLinkedSrv.Catalog.Dbo.OtherTable 上是否也有触发器?
  • @Gratzy - 不,OtherTable 没有定义触发器
  • 它是否发生在显式事务中?是否在两台服务器上都打开了 DTC?
  • 您是否尝试过将其作为触发器而不是触发器来实现?您对原始插入使用什么类型的事务?你有没有考虑过在本地记录这个并使用后台进程来更新远程服务器(这样远程服务器不会使主事务复杂化,并且主事务不必等待远程操作)。
  • @Gratzy 目前我正在我的开发机器上测试它;我已连接到本地 SQLSserver 实例,并且链接服务器指向同一实例。 MSDTC 正在运行。

标签: tsql triggers sql-server-2008-r2 linked-server


【解决方案1】:

如果启用 MARS,则不能在分布式事务中使用环回链接服务器。

环回链接服务器不能用于分布式事务。 尝试针对环回链接服务器的分布式查询 在分布式事务中导致错误,例如错误 3910: "[Microsoft][ODBC SQL Server Driver][SQL Server]事务上下文在 由另一个会话使用。”此限制不适用于当 INSERT...EXECUTE 语句,由不具有 启用多个活动结果集 (MARS),针对 环回链接服务器。请注意,该限制仍然适用于 MARS 在连接上启用。

http://msdn.microsoft.com/en-us/library/ms188716(SQL.105).aspx

【讨论】:

    【解决方案2】:

    我解决它。 我使用同一个链接服务器调用第二个过程,然后进入我使用同一个链接服务器的过程。

    很简单,只需要知道链接服务器的限制。

    【讨论】:

      【解决方案3】:

      我已经通过删除存储过程中使用的链接服务器解决了这个问题,然后由同一链接服务器调用存储过程。它不能在 DEV 环境中工作。

      【讨论】:

        【解决方案4】:

        造成这种情况的原因之一是适用于链接服务器数据库表的触发器。处理数据库事务的 SQL-Server 的 SQL 版本。为避免在 sql 查询执行期间出现此错误,我们应暂时禁用并在执行后启用更新表的触发器。全部带有数据库名称检查。这是一个例子:

             Select * From People  where PersonId In (@PersonId, @PersonIdRight)
             IF 'DOUBLE' = DB_NAME()
                ALTER TABLE [dbo].[PeopleSites] DISABLE TRIGGER [PeopleSites_ENTDB_UPDATE]
        
             Update PeopleSites Set PersonId = @PersonIdRight Where  PersonId = @PersonId
        
             IF 'DOUBLE' = DB_NAME()
                ALTER TABLE [dbo].[PeopleSites] ENABLE TRIGGER [PeopleSites_ENTDB_UPDATE]
        
        
             Select * From PeopleSites where PersonId In (@PersonId, @PersonIdRight)
        

        【讨论】:

          【解决方案5】:

          我在我们的 DEV 环境中也遇到了同样的错误,将链接的数据库移动到另一个 sql 实例解决了这个问题。在我们的生产环境中,这些数据库已经在不同的实例上

          【讨论】:

            【解决方案6】:

            在我的情况下,我使用 SQL 2005 并在链接服务器上运行 Insert....exec 时得到“另一个会话正在使用的事务上下文”。对我来说,修复是从 SP2 build 3161 修补到 SP3。 SP2 累积 5 应该可以修复。

            https://support.microsoft.com/en-us/kb/947486

            【讨论】:

              【解决方案7】:

              当远程数据库位于同一台服务器上时,配置链接服务器而不指定数据库服务器ip/主机名和端口。只需数据库名称就足够了。

              【讨论】:

                【解决方案8】:

                在尝试运行 UPDATE 查询时,我得到了相同的“另一个会话错误正在使用事务上下文”:

                 BEGIN      TRAN
                --ROLLBACK  TRAN
                --COMMIT    TRAN
                UPDATE  did 
                SET     did.IsProcessed = 0,
                        did.ProcessingLockID = NULL
                FROM    [proddb\production].DLP.dbo.tbl_DLPID did (NOLOCK)
                WHERE   did.dlpid IN ('bunch of GUIDs')
                --WHERE   did.DLPID IN (SELECT DLPID FROM @TableWithData)
                

                但是我没有意识到我已经尝试在 ProdDb\Production 服务器上的 DLP 数据库上运行它。一旦我删除了“[proddb\production].DLP.dbo”。查询的前缀,它工作正常。

                【讨论】:

                  猜你喜欢
                  • 2016-05-15
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-01-10
                  • 1970-01-01
                  • 2012-10-20
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-08-13
                  相关资源
                  最近更新 更多