Frage

Ich habe eine MSSSQL gespeicherte Prozedur eine verteilte Transaktion ausführt, die wie folgt aussieht:

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

Das funktioniert gut.

Wenn ich hinzufügen, um diese dritte Insert-Anweisung:

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

... es nicht richtig -. Die Transaktion wird auf dem Remote-Server zurückgesetzt und die Steuerung geht auf den Block CATCH und ich Informationen über die Fehlermeldung ( ‚Fehler‘ nicht konvertieren int)

Aber wenn ich diese Insert-Anweisung hinzufügen:

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

.. und ich habe einen Scheck contraint auf dem Remote-Tabellenwerte> 0 in der Spalte id erfordert, dann wird es nicht funktionieren, wie ich erwartet. Die Transaktion DOES rollen zurück, aber die Kontrolle DOES NOT Transfer zum catch-Block. Stattdessen Ausführung gerade stirbt und dies in das Ausgabefenster gedruckt wird:

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

Warum? Ich brauche diese Fehler in den Fang Blog loggt sein.

War es hilfreich?

Lösung

Da der Koordinator für verteilte Transaktionen dies ist der Umgang, wenn die Transaktion auf dem verteilten Teil der Transaktion fehlschlägt, sendet der DTC eine Nachricht in Form einer Aufmerksamkeit, die die Ausführung von Code hält und welche die try / catch kann nicht Prozess.

SQL Server kann auf Ihrem Ende erkennen, wenn Sie einen falschen Datentyp in eine Tabelle (auch auf einer Remote-Instanz) versuchen, einzufügen, aber die Einschränkung auf dem Verbindungsserver verarbeitet wird, die die Aufmerksamkeit verursacht DTC gesendet werden und Ihre try / catch ignoriert werden.

Weitere Informationen finden Sie in dem ersten "Note" in dem "Verwenden von TRY ... CATCH in Transact-SQL" in SQL Server 2008-Online, finden Sie unter:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top