استخدام المعاملات مع تجمع 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 بلا خادم.