由另一个会话使用事务上下文(Transaction context in use by anothe

2019-06-24 15:55发布

我有一个名为表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工作得很好)。

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

Answer 1:

环回链接服务器可如果启用了MARS无法在分布式事务中使用。

环回链接的服务器无法在分布式事务中使用。 从内部分布式事务导致错误尝试对环回链接服务器分布式查询,如错误3910:“[微软] [ODBC SQL Server驱动程序] [SQL服务器]在另一个会话使用事务上下文。” 当INSERT ... EXECUTE语句,由不具有多个活动结果集(MARS)启用连接发出,执行针对环回链接服务器此限制不适用。 请注意,当火星在连接上启用这一限制仍然适用。

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



Answer 2:

我解决这个问题。 我用的是相同的链接服务器调用第二个过程,然后进入我的程序使用相同的链接服务器。

这很容易,只是我们必须知道链接的服务器的restricctions。



Answer 3:

我也得到了同样的错误在我们的DEV environemnt,移动链接的数据库到另一个SQL实例解决了这个问题。 在我们的生产环境中,这些数据库都已经在不同的情况下,



Answer 4:

在我来说,我是使用SQL 2005和通过链接服务器运行插入.... Exec时得到了“由另一个会话使用事务上下文”。 对我来说,修复是由SP2版本3161补丁到SP3。 SP2累积5理应虽然修复。

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



Answer 5:

当远程数据库位于同一台服务器上,配置链接的服务器,而无需指定数据库服务器IP /主机名和端口。 就在数据库名称应该是足够的。



Answer 6:

我已经通过去除在存储过程中使用的链接服务器解决它,然后叫由同一链接服务器存储过程。 它不是在DEV environement工作。



文章来源: Transaction context in use by another session