17

我有一个表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工作正常)。

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

4

8 回答 8

24

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

环回链接服务器不能用于分布式事务。尝试从分布式事务中对环回链接服务器执行分布式查询会导致错误,例如错误 3910:“[Microsoft][ODBC SQL Server Driver][SQL Server]Transaction context in use by another session。” 当由未启用多个活动结果集 (MARS) 的连接发出的 INSERT...EXECUTE 语句针对环回链接服务器执行时,此限制不适用。请注意,当在连接上启用 MARS 时,该限制仍然适用。

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

于 2012-05-22T15:27:56.560 回答
1

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

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

于 2015-11-20T17:45:38.903 回答
1

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

于 2016-11-15T19:47:09.677 回答
1

这种情况的原因之一是适用于链接服务器数据库表的触发器。处理数据库事务的 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)
于 2020-05-19T12:22:13.140 回答
0

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

于 2014-10-29T11:34:22.390 回答
0

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

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

于 2016-02-12T16:38:21.497 回答
0

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

于 2016-09-05T10:07:39.797 回答
0

尝试运行 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”。查询的前缀,它工作正常。

于 2019-07-17T15:10:18.793 回答