مشاركة عبر


استخدام المعاملات مع تجمع SQL المخصص في Azure Synapse Analytics

تلميحات حول تنفيذ المعاملات باستخدام تجمع SQL المخصص في Azure Synapse Analytics لتطوير الحلول.

ما المتوقع

كما تتوقع، يدعم تجمع SQL المخصص المعاملات كجزء من حمل عمل مستودع البيانات. ومع ذلك، لضمان الحفاظ على أداء تجمع SQL المخصص على نطاق واسع، تكون بعض الميزات محدودة عند مقارنتها بـ SQL Server. هذه المقالة تسلط الضوء على الاختلافات وتسرد الآخرين.

مستويات عزل المعاملات

يقوم تجمع SQL المخصص بتنفيذ معاملات ACID. مستوى عزل دعم المعاملات هو الافتراضي للقراءة غير ملتزم. يمكنك تغييره إلى وضع «عزل لقطة تنفيذ القراءة» حسب تشغيل خيار قاعدة بيانات لقطة تنفيذ القراءة لقاعدة بيانات مستخدم عند الاتصال بقاعدة البيانات الرئيسية.

بمجرد تمكينها، يتم تنفيذ كافة المعاملات في قاعدة البيانات ضمن «عزل لقطة تنفيذ القراءة» ولن يُحترم إعداد لقطة عدم تنفيذ القراءة على مستوى الجلسة. تحقق من خيارات ALTER DATABASE SET (Transact-SQL) للتفاصيل.

حجم العملية

عملية تعديل بيانات واحدة محدودة الحجم. ويتم تطبيق الحد لكل توزيع. وعلى هذا النحو، يمكن حساب إجمالي التخصيص بضرب الحد في عدد التوزيع.

لتقريب الحد الأقصى لعدد الصفوف في العملية، قسّم غطاء التوزيع على الحجم الإجمالي لكل صف. بالنسبة للأعمدة ذات الطول المتغير، ضع في اعتبارك أخذ متوسط ​​طول العمود بدلاً من استخدام الحد الأقصى للحجم.

في الجدول أدناه، تم وضع الافتراضات التالية:

  • حدث توزيع متساوٍ للبيانات
  • يبلغ متوسط ​​طول الصف 250 بايت

Gen2

DWU الحد الأقصى لكل توزيع (GB) عدد التوزيعات حجم العملية MAX (GB) عدد الصفوف لكل توزيع الحد الأقصى للصفوف لكل عملية
DW100c 1 60 60 4,000,000 240,000,000
DW200c 1.5 60 90 6,000,000 360,000,000
DW300c 2.25 60 135 9,000,000 540,000,000
DW400c 3 60 180 12,000,000 720,000,000
DW500c 3.75 60 225 15,000,000 900,000,000
DW1000c 7.5 60 450 30,000,000 1,800,000,000
DW1500c 11.25 60 675 45,000,000 2,700,000,000
DW2000c 15 60 900 60,000,000 3,600,000,000
DW2500c 18.75 60 1125 75,000,000 4,500,000,000
DW3000c 22.5 60 1,350 90,000,000 5,400,000,000
DW5000c 37.5 60 2,250 150,000,000 9,000,000,000
DW6000c 45 60 2,700 180,000,000 10,800,000,000
DW7500c 56.25 60 3,375 225,000,000 13,500,000,000
DW10000c 75 60 4,500 300,000,000 18,000,000,000
DW15000c 112.5 60 6,750 450,000,000 27,000,000,000
DW30000c 225 60 13,500 900,000,000 54,000,000,000

Gen1

DWU الحد الأقصى لكل توزيع (GB) عدد التوزيعات حجم العملية MAX (GB) عدد الصفوف لكل توزيع الحد الأقصى للصفوف لكل عملية
DW100 1 60 60 4,000,000 240,000,000
DW200 1.5 60 90 6,000,000 360,000,000
DW300 2.25 60 135 9,000,000 540,000,000
DW400 3 60 180 12,000,000 720,000,000
DW500 3.75 60 225 15,000,000 900,000,000
DW600 4.5 60 270 18,000,000 1,080,000,000
DW1000 7.5 60 450 30,000,000 1,800,000,000
DW1200 9 60 540 36,000,000 2,160,000,000
DW1500 11.25 60 675 45,000,000 2,700,000,000
DW2000 15 60 900 60,000,000 3,600,000,000
DW3000 22.5 60 1,350 90,000,000 5,400,000,000
DW6000 45 60 2,700 180,000,000 10,800,000,000

يتم تطبيق حد لحجم المعاملة لكل معاملة أو عملية. لا يتم تطبيقه في جميع المعاملات المتزامنة. لذلك يُسمح لكل معاملة بكتابة هذا المقدار من البيانات في السجل.

لتحسين كمية البيانات المكتوبة في السجل وتقليلها، راجع مقالة أفضل ممارسات المعاملات.

تحذير

لا يمكن تحقيق الحد الأقصى لحجم المعاملة إلا لجداول HASH أو ROUND_ROBIN الموزعة، إذ يكون انتشار البيانات متساويًا. إذا كانت المعاملة تكتب البيانات بطريقة منحرفة للتوزيعات، فمن المحتمل أن يتم الوصول إلى الحد قبل الحد الأقصى لحجم المعاملة.

حالة العملية

يستخدم تجمع SQL المخصص الدالة XACT_STATE () للإبلاغ عن معاملة فاشلة باستخدام القيمة -2. تعني هذه القيمة أن المعاملة قد فشلت وتم وضع علامة عليها للتراجع فقط.

ملاحظة

يمثل استخدام -2 بواسطة الدالة XACT_STATE للإشارة إلى معاملة فاشلة سلوكًا مختلفًا لـ SQL Server. يستخدم SQL Server القيمة -1 لتمثيل معاملة غير قابلة للالتزام. يمكن أن يتسامح SQL Server مع بعض الأخطاء داخل المعاملة دون الحاجة إلى وضع علامة عليها على أنها غير قابلة للالتزام. على سبيل المثال، قد يتسبب SELECT 1/0 في حدوث خطأ ولكن لا يجبر المعاملة للدخول في حالة غير قابلة للالتزام. يسمح SQL Server أيضًا بالقراءة في المعاملة غير القابلة للالتزام. ومع ذلك، لا يتيح لك تجمع SQL المخصص القيام بذلك. إذا حدث خطأ داخل معاملة تجمع SQL المخصص، فسوف تدخل تلقائيًا الحالة -2 ولن تكون قادرًا على إجراء أي عبارات تحديد أخرى حتى تتم عودة العبارة إلى الحالة السابقة. لذلك من المهم التحقق من التعليمات البرمجية للتطبيق الخاص بك لمعرفة ما إذا كان يستخدم XACT_STATE() حيث قد تحتاج إلى إجراء تعديلات على التعليمات البرمجية.

وعلى سبيل المثال، في SQL Server قد ترى معاملة تشبه ما يلي:

SET NOCOUNT ON;
DECLARE @xact_state smallint = 0;

BEGIN TRAN
    BEGIN TRY
        DECLARE @i INT;
        SET     @i = CONVERT(INT,'ABC');
    END TRY
    BEGIN CATCH
        SET @xact_state = XACT_STATE();

        SELECT  ERROR_NUMBER()    AS ErrNumber
        ,       ERROR_SEVERITY()  AS ErrSeverity
        ,       ERROR_STATE()     AS ErrState
        ,       ERROR_PROCEDURE() AS ErrProcedure
        ,       ERROR_MESSAGE()   AS ErrMessage
        ;

        IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK TRAN;
            PRINT 'ROLLBACK';
        END

    END CATCH;

IF @@TRANCOUNT >0
BEGIN
    PRINT 'COMMIT';
    COMMIT TRAN;
END

SELECT @xact_state AS TransactionState;

تعطي التعليمات البرمجية السابقة رسالة الخطأ التالية:

رسالة 111233، مستوى 16، حالة 1، سطر 1 111233؛ تم إحباط العملية الحالية، وتم التراجع عن أية تغييرات معلقة. السبب: لم تتم صراحةً العودة إلى الحالة السابقة لمعاملة في حالة العودة إلى الحالة السابقة قبل عبارة DDL أو DML أو SELECT.

لن تحصل على إخراج وظائف ERROR_ *.

في تجمع SQL المخصص، يجب تغيير التعليمات البرمجية بشكل طفيف:

SET NOCOUNT ON;
DECLARE @xact_state smallint = 0;

BEGIN TRAN
    BEGIN TRY
        DECLARE @i INT;
        SET     @i = CONVERT(INT,'ABC');
    END TRY
    BEGIN CATCH
        SET @xact_state = XACT_STATE();

        IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK TRAN;
            PRINT 'ROLLBACK';
        END

        SELECT  ERROR_NUMBER()    AS ErrNumber
        ,       ERROR_SEVERITY()  AS ErrSeverity
        ,       ERROR_STATE()     AS ErrState
        ,       ERROR_PROCEDURE() AS ErrProcedure
        ,       ERROR_MESSAGE()   AS ErrMessage
        ;
    END CATCH;

IF @@TRANCOUNT >0
BEGIN
    PRINT 'COMMIT';
    COMMIT TRAN;
END

SELECT @xact_state AS TransactionState;

يتم الآن ملاحظة السلوك المتوقع. تتم إدارة الخطأ في المعاملة وتوفر الدالات ERROR_ * القيم كما هو متوقع.

كل ما تغير هو أن ROLLBACK للمعاملة يجب أن يحدث قبل قراءة معلومات الخطأ في كتلة CATCH.

دالة Error_Line()

من الجدير بالذكر أيضًا أن تجمع SQL المخصص لا يقوم بتنفيذ أو دعم دالة ERROR_LINE(). إذا كان لديك هذه الدالة في التعليمات البرمجية الخاصة بك، فأنت بحاجة إلى إزالتها لتكون متوافقة مع تجمع SQL المخصص. استخدم تسميات الاستعلام في التعليمات البرمجية الخاصة بك بدلاً من ذلك لتنفيذ وظائف مكافئة. لمزيد من المعلومات، راجع مقالة التسمية.

استخدام THROW وعبارة RAISERROR

تُعد THROW التطبيق الأكثر حداثة لزيادة الاستثناءات في تجمع SQL المخصص ولكن عبارة RAISERROR مدعومة أيضًا. ومع ذلك، هناك بعض الاختلافات التي تستحق الاهتمام بها.

  • لا يمكن أن تكون أرقام رسائل الخطأ المعرفة من قبل المستخدم في النطاق 100,000 - 150,000 لـ THROW
  • تم إصلاح رسائل الخطأ لعبارة RAISERROR عند 50,000
  • استخدام رسائل sys.messages غير مدعوم

التقييدات

يحتوي تجمع SQL المخصص على بعض القيود الأخرى التي تتعلق بالمعاملات. تظهر تلك الادعاءات كما يلي:

  • لا توجد معاملة موزعة
  • لا يسمح بأي معاملات متداخلة
  • لا يسمح بنقاط حفظ
  • لا توجد معاملات باسم
  • لا توجد معاملات محددة
  • لا يوجد دعم لـ DDL مثل CREATE TABLE داخل معاملة معرفة من المستخدم

الخطوات التالية

ولمعرفة المزيد حول تحسين المعاملات، راجع أفضل ممارسات المعاملات. يتم أيضًا توفير أدلة أفضل الممارسات الإضافية لتجمع SQL المخصص وتجمع SQL بلا خادم.