تحقق مناقشة تجاوز كتلة الصيد في المعاملات الموزعة
-
23-08-2019 - |
سؤال
لدي إجراء 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، الموجودة في: