سؤال

لدي إجراء MSSSQL المخزن أداء معاملة موزعة تبدو مثل هذا:

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

هذا يعمل بشكل جيد.

إذا أضفت بيان الإدراج الثالث:

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

... فشل بشكل صحيح - يتم التراجع عن المعاملة على الخادم البعيد والتحكم يمر إلى كتلة الصيد والحصول على معلومات حول الخطأ (لا يمكن تحويل الخطأ "خطأ" إلى INT).

ولكن إذا قمت بإضافة بيان إدراج هذا:

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

.. وان لدي فحص مناقشة على الطاولة البعيدة التي تتطلب القيم> 0 في عمود المعرف، ثم لا تعمل الأمور كما أتوقع. الصفقة هل لفة مرة أخرى، ولكن السيطرة لا نقل إلى كتلة الصيد. بدلا من ذلك، يموت التنفيذ فقط ويتم طباعة هذا إلى نافذة الإخراج:

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

لماذا ا؟ أحتاج إلى تسجيل هذه الأخطاء في مدونة الصيد.

هل كانت مفيدة؟

المحلول

نظرا لأن منسق المعاملات الموزعة هو التعامل مع هذا، عندما تفشل المعاملة في الجزء الموزع من المعاملة، ترسل DTC رسالة في شكل اهتمام، مما يمنع التعليمات البرمجية الخاصة بك من التنفيذ، والتي لا يمكن للمحاولة / التقاط معالجة.

يمكن ل SQL Server الكشف عن نهايتك عند محاولة إدراج نوع بيانات غير صحيح في جدول (حتى في حالة عن بعد)، لكن القيد معالجته على الخادم المرتبط، مما يؤدي إلى إرسال الانتباه إلى DTC وجربتك / قبض على أن يتم تجاهلها.

لمزيد من المعلومات، راجع قسم "الملاحظات" الأول في قسم "استخدام TRY ... Catch in Transact-SQL" من كتب SQL Server 2008، الموجودة في:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top