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

У меня есть таблица под названием 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, уровень 16, состояние 2, строка 1 Контекст транзакции используется другим сеансом.

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

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

Ответ 1

Связанные с Loopback серверы не могут использоваться в распределенной транзакции, если включена MARS.

Связанные с Loopback серверы не могут использоваться в распределенной транзакции. Попытка распределенного запроса на связанный с петлей сервер в распределенной транзакции вызывает ошибку, например ошибку 3910: "[Microsoft] [Драйвер SQL-сервера ODBC] [SQL Server] Контекст транзакции в использование другим сеансом". Это ограничение не применяется, когда INSERT... EXECUTE, выданный соединением, которое не имеет множество активных наборов результатов (MARS) включено, выполняется против loopback связанный сервер. Обратите внимание, что ограничение по-прежнему применяется, когда MARS активируется при подключении.

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Я получаю тот же "контекст транзакции, используемый другой ошибкой сеанса" при попытке выполнить запрос 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)

Однако я не осознавал, что уже пытался запустить это в базе данных DLP на сервере ProdDb\Production. Однажды я удалил это "[proddb\production].DLP.dbo". Префикс из запроса, все работало нормально.