我有一个名为表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
工作得很好)。
如何避免错误,并成功地插入记录+执行触发器?
环回链接服务器可如果启用了MARS无法在分布式事务中使用。
环回链接的服务器无法在分布式事务中使用。 从内部分布式事务导致错误尝试对环回链接服务器分布式查询,如错误3910:“[微软] [ODBC SQL Server驱动程序] [SQL服务器]在另一个会话使用事务上下文。” 当INSERT ... EXECUTE语句,由不具有多个活动结果集(MARS)启用连接发出,执行针对环回链接服务器此限制不适用。 请注意,当火星在连接上启用这一限制仍然适用。
http://msdn.microsoft.com/en-us/library/ms188716(SQL.105).aspx
我解决这个问题。 我用的是相同的链接服务器调用第二个过程,然后进入我的程序使用相同的链接服务器。
这很容易,只是我们必须知道链接的服务器的restricctions。
我也得到了同样的错误在我们的DEV environemnt,移动链接的数据库到另一个SQL实例解决了这个问题。 在我们的生产环境中,这些数据库都已经在不同的情况下,
在我来说,我是使用SQL 2005和通过链接服务器运行插入.... Exec时得到了“由另一个会话使用事务上下文”。 对我来说,修复是由SP2版本3161补丁到SP3。 SP2累积5理应虽然修复。
https://support.microsoft.com/en-us/kb/947486
当远程数据库位于同一台服务器上,配置链接的服务器,而无需指定数据库服务器IP /主机名和端口。 就在数据库名称应该是足够的。
我已经通过去除在存储过程中使用的链接服务器解决它,然后叫由同一链接服务器存储过程。 它不是在DEV environement工作。