Domanda

Ho una procedura MSSSQL memorizzato l'esecuzione di una transazione distribuita che assomiglia a questo:

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

Questo funziona bene.

Se aggiungo questa dichiarazione terzo inserto:

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

... non riesce correttamente -. La transazione viene abortita sul server remoto e il controllo passa al blocco CATCH e ottengo le informazioni sull'errore (non in grado di convertire 'errore' a int)

Ma se aggiungo questa dichiarazione inserto:

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

.. e ho un contraint controllo sulla tabella remota che richiede valori> 0 nella colonna ID, poi le cose non funzionano come mi aspetto. L'operazione Il rollback, ma il controllo non trasferimento al blocco catch. Invece, l'esecuzione solo muore e questo viene stampato su finestra di output:

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

Perché? Ho bisogno di registrare questi errori nel blog cattura.

È stato utile?

Soluzione

Dato che il Distributed Transaction Coordinator sta gestendo questo, quando la transazione non riesce in parte distribuita della transazione, il DTC invia un messaggio in forma di attenzione, che ferma il codice da eseguire, e che il try / catch non può processo.

SQL Server è in grado di rilevare da parte vostra quando si sta cercando di inserire un tipo di dati non corretti in una tabella (anche su un'istanza remota), ma il vincolo viene elaborata sul server collegato, che fa sì che l'attenzione da inviare al DTC e il tuo try / catch per essere ignorato.

Per ulteriori informazioni vedere la prima sezione "Note" in "Utilizzo di TRY ... CATCH in Transact-SQL" di SQL Server 2008 documentazione in linea, che si trova all'indirizzo:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top