web-dev-qa-db-fra.com

Contexte de transaction utilisé par une autre session

J'ai une table appelée MyTable sur laquelle j'ai défini un déclencheur, comme ceci:

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

Chaque fois que j'essaie d'insérer une ligne dans MyTable, le message d'erreur suivant s'affiche:

Msg 3910, Niveau 16, Etat 2, Ligne 1 Contexte de transaction utilisé par une autre session.

J'ai SomeLinkedSrv correctement défini en tant que serveur lié (par exemple, select * from SomeLinkedSrv.Catalog.dbo.OtherTable fonctionne très bien).

Comment puis-je éviter l'erreur et insérer avec succès record + execute le déclencheur?

12
Cristian Lupascu

Les serveurs liés en boucle ne peuvent pas être utilisés dans une transaction distribuée si MARS est activé.

Les serveurs liés en boucle ne peuvent pas être utilisés dans une transaction distribuée. Essayer une requête distribuée sur un serveur lié en boucle depuis Dans une transaction distribuée provoque une erreur, telle que l'erreur 3910: " [Microsoft] [Pilote ODBC SQL Server] [SQL Server] Le contexte de la transaction dans Est utilisé par une autre session. " Cette restriction ne s'applique pas lorsqu'une instruction INSERT ... EXECUTE, émise par une connexion sur laquelle ne dispose pas de plusieurs jeux de résultats actifs (MARS), s'exécute avec une boucle de rappel . serveur lié. Notez que la restriction s'applique toujours lorsque MARS est activé sur une connexion.

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

17
Gratzy

Je le résous. J'utilisais le même serveur lié pour appeler la deuxième procédure, puis j'utilisais le même serveur lié.

C'est très facile, il suffit de connaître les restrictions des serveurs liés.

1
David Castro

Lorsque la base de données distante se trouve sur le même serveur, configurez le serveur lié sans spécifier l'adresse IP/nom d'hôte et le port du serveur de base de données. Le nom de la base de données devrait suffire.

0
crathour

Dans mon cas, j’utilisais SQL 2005 et j’ai eu le "contexte de transaction utilisé par une autre session" lors de l’exécution de Insert .... exec sur un serveur lié. Pour moi, le correctif consistait à installer un correctif de SP2 build 3161 à SP3. Le SP2 cumulatif 5 est censé réparer cependant.

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

0
lawsonta

J'ai également eu la même erreur dans notre environnement DEV, le déplacement des bases de données liées vers une autre instance SQL a résolu le problème. Dans notre environnement de production, ces bases de données sont déjà sur des instances séparées

0
sumit chauhan

Je l'ai résolu en supprimant le serveur lié utilisé dans la procédure stockée, puis appelé procédure stockée par le même serveur lié. Cela ne fonctionnait pas dans l'environnement DEV.

0
Kalpesh S