web-dev-qa-db-fra.com

SQL Server Linked Server: "Impossible de démarrer plus de transactions à cette session."

j'essaie d'effectuer une opération INSERT sur un serveur lié:

DBCC TRACEON (3604, 7300)

BEGIN TRANSACTION

INSERT INTO LIVE.Contoso.dbo.Events (EventGUID, EventDate, LoginGUID, UserGUID, EventType, Notes, TargetGUID) 
VALUES ('{494D023F-CD5A-11E2-9F18-C86000D0B92A}', getdate(), '{3B4F90C0-CD5A-11E2-9F18-C86000D0B92A}', '{494D023D-CD5A-11E2-9F18-C86000D0B92A}', 1, N'Test notes', '{494D023E-CD5A-11E2-9F18-C86000D0B92A}')

ROLLBACK TRANSACTION

et il renvoie l'erreur:

OLE DB Fournisseur "SQLNCLI" pour serveur lié "LIVE" Message renvoyé "ne peut pas commencer plus de transactions à cette session.".
[.____] MSG 7395, niveau 16, État 2, ligne 3
Impossible de démarrer une transaction imbriquée pour OLE DB Fournisseur "SQLNCLI" pour serveur lié "Live". Une transaction imbriquée était nécessaire car l'option Xact_Abort a été définie sur OFF.

Cette base de données locale a été déplacée de 2000 (où les requêtes travaillaient) à 2005 (où intervient sans travail). Le serveur distant est 2008 R2.

Qu'avez-vous essayé?

La liste exhaustive des choses de cette question que j'ai posée il y a deux ans .

Comment avez-vous créé le serveur lié?

--EXEC master.dbo.sp_dropserver @server = N'LIVE'
EXEC master.dbo.sp_addlinkedserver @server = N'LIVE', @srvproduct=N'', @provider=N'SQLOLEDB', @datasrc=N'vader'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LIVE', @locallogin = NULL, @useself = N'False', @rmtuser = N'Contoso', @rmtpassword = N'Battery Horse Staple Correct'

Mais qu'avez-vous essayé?

  • j'ai désactivé toutes les options de sécurité MSDTC sur les deux serveurs

    enter image description here

  • vérifié que les horloges sont en synchronisation (qui pour une raison inconnue brisera divers systèmes d'authentification si elles sont hors de synchronisation)

    enter image description here

  • j'ai désactivé des pare-feu sur les deux serveurs (pas d'écran; vous devrez simplement me faire confiance)

  • laissant la réjouissance du domaine

Quelles sont les versions des serveurs?

  • local : Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
  • Remote liée : Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
3
Ian Boyd

De la documentation de SET XACT_ABORT :

Xact_Abort doit être défini sur des instructions de modification de données dans une transaction implicite ou explicite contre la plupart OLE DB fournisseurs, y compris SQL Server. Le seul cas où cette option n'est pas requise est si le fournisseur prend en charge les transactions imbriquées . "

Peut-être utilisiez-vous un fournisseur qui appuyait des transactions imbriquées en 2000. Semblait que vous devez définir XACT_ABORT. Je ne sais pas si cela convient à ce que votre code de production fait cependant.

Cette réponse peut aider: Quel est l'avantage d'utiliser "SET XACT_ABORT sur" dans une procédure stockée?

4
Sam