Question

J'ai une procédure stockée MSSSQL effectuer une transaction distribuée qui ressemble à ceci:

SET XACT_ABORT ON;
SET NOCOUNT ON;

BEGIN TRY
  BEGIN DISTRIBUTED TRANSACTION


  insert into LNKSRV.INST.dbo.zz (id, val) values (1, 'a');
  insert into LNKSRV.INST.dbo.zz (id, val) values (2, 'b');


  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  if (XACT_STATE() <> 0) 
  BEGIN
    ROLLBACK TRANSACTION;
  END
  print ERROR_MESSAGE();
  print ERROR_LINE();
  print ERROR_SEVERITY();

END CATCH

Cela fonctionne très bien.

Si j'ajoute cette 3ème instruction d'insertion:

  insert into LNKSRV.INST.dbo.zz (id, val) values ('error', 'b');

... il échoue correctement -. La transaction est annulée sur le serveur distant et le contrôle passe au bloc CATCH et j'obtenir des informations sur l'erreur (ne peut pas convertir « erreur » int)

Mais si j'ajoute cette déclaration d'insertion:

  insert into LNKSRV.INST.dbo.zz (id, val) values (-1, 'b');

.. et j'ai un chèque sur la table contraint à distance nécessitant des valeurs> 0 dans la colonne id, alors les choses ne fonctionnent pas comme je le pense. La transaction FONCTIONNE faire reculer, mais le contrôle ne pas transfert au bloc catch. Au lieu de cela, l'exécution meurt juste et ceci est imprimé à la fenêtre de sortie:

The Microsoft Distributed Transaction Coordinator (MS DTC) has cancelled the distributed transaction

Pourquoi? Je dois vous connecter ces erreurs dans le blog de capture.

Était-ce utile?

La solution

Depuis le coordinateur de transactions gère ce, lorsque la transaction échoue sur la partie distribuée de la transaction, le DTC envoie un message sous la forme d'une attention qui arrête votre code d'exécution, et que le TRY / CATCH ne peut pas processus.

SQL Server peut détecter votre côté lorsque vous essayez d'insérer un type de données incorrectes dans une table (même sur une instance à distance), mais la contrainte est traitée sur le serveur lié, ce qui provoque l'attention à envoyer à la DTC et votre TRY / CATCH à ignorer.

Pour plus d'informations, voir la première section "Note" dans la section "Utilisation ... CATCH dans TRY Transact-SQL" section de SQL Server 2008 en ligne, à l'adresse:

http://msdn.microsoft.com/en-us/library /ms179296.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top