Контекст транзакции используется другим сеансом

У меня есть стол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Я получаю это сообщение об ошибке:

Msg 3910, Level 16, State 2, Line 1 Transaction context in use by another session.

я имеюSomeLinkedSrv правильно определен как связанный сервер (например,select * from SomeLinkedSrv.Catalog.dbo.OtherTable работает просто отлично).

Как можно избежать ошибки и успешно вставить запись + выполнить триггер?

 Aaron Bertrand22 мая 2012 г., 17:13
Вы пытались реализовать это как триггер вместо? Какой тип транзакции вы используете для оригинальной вставки? Рассматривали ли вы запись этого локально и использование фонового процесса для обновления удаленного сервера (таким образом, удаленный сервер не усложняет первичную транзакцию, и первичной транзакции не нужно ждать удаленной операции).
 Cristian Lupascu22 мая 2012 г., 17:16
@ На данный момент я испытываю это на своем компьютере разработчика; Я подключен к локальному экземпляру SQLSserver, и связанный сервер указывает на этот экземпляр. MSDTC работает.
 Gratzy22 мая 2012 г., 17:01
случается также, чтобы быть триггером на SomeLinkedSrv.Catalog.Dbo.OtherTable?
 Cristian Lupascu22 мая 2012 г., 17:11
@Gratzy - нет,OtherTable триггеры не определены
 Gratzy22 мая 2012 г., 17:13
Это происходит в явной транзакции? Включен ли DTC на обоих серверах?

Ответы на вопрос(6)

настройте связанный сервер без указания ip / hostname и порта сервера базы данных. Достаточно только имени базы данных.

Я использовал тот же связанный сервер для вызова второй процедуры, а затем в процедуру, которую я использовал на том же связанном сервере.

Это очень просто, только мы должны знать ограничения связанных серверов.

используемый другим сеансом». при запуске Insert .... exec через связанный сервер. Исправление для меня было патч от SP2 build 3161 до SP3. SP2 кумулятивный 5 должен исправить, хотя.

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

удалив связанный сервер, используемый в хранимой процедуре, а затем вызвал хранимую процедуру тем же связанным сервером. Он не работал в среде DEV.

Решение Вопроса

еделенной транзакции, если включен MARS.

Loopback linked servers cannot be used in a distributed transaction. Trying a distributed query against a loopback linked server from within a distributed transaction causes an error, such as error 3910: "[Microsoft][ODBC SQL Server Driver][SQL Server]Transaction context in use by another session." This restriction does not apply when an INSERT...EXECUTE statement, issued by a connection that does not have multiple active result sets (MARS) enabled, executes against a loopback linked server. Note that the restriction still applies when MARS is enabled on a connection.

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

перенося связанные базы данных в другой экземпляр sql, решил проблему. В нашей производственной среде эти базы данных уже находятся в отдельных экземплярах.

Ваш ответ на вопрос