transacciones tipos sirven registro que para los lock eliminar ejemplos distribuidas datos bloqueos bloquear sql-server tsql error-handling transactions distributed-transactions

sql server - tipos - Verifique el bloqueo de omisión de CATCH en transacciones distribuidas



tipos de bloqueos sql server (1)

Tengo un procedimiento almacenado MSSSQL que realiza una transacción distribuida que se ve así:

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

Esto funciona bien

Si agrego esta tercera declaración de inserción:

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

... falla correctamente: la transacción se retrotrae al servidor remoto y el control pasa al bloque CATCH y obtengo información sobre el error (no puede convertir ''error'' en int).

Pero si agrego esta declaración de inserción:

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

..y tengo un checkint checkint en la tabla remota que requiere valores> 0 en la columna de identificación, entonces las cosas no funcionan como esperaba. La transacción DEJA retroceder, pero el control NO se transfiere al bloque catch. En cambio, la ejecución simplemente muere y esto se imprime en la ventana de salida:

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

¿Por qué? Necesito registrar estos errores en el blog catch.


Dado que el coordinador de transacciones distribuidas está manejando esto, cuando la transacción falla en la parte distribuida de la transacción, el DTC envía un mensaje en forma de atención, que detiene la ejecución de su código y que TRY / CATCH no puede procesar.

SQL Server puede detectar en su extremo cuando intenta insertar un tipo de datos incorrecto en una tabla (incluso en una instancia remota) pero la restricción se procesa en el servidor vinculado, lo que hace que se envíe la atención a DTC y a su TRY / CATCH para ser ignorado.

Para obtener más información, consulte la primera sección "Nota" en la sección "Uso de TRY ... CATCH en Transact-SQL" de los Libros en pantalla de SQL Server 2008, que se encuentra en:

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