فهم التأمين

مكتمل

يوفر التحكم في التزامن متعدد الإصدارات (MVCC) إعدادات التزامن المناسبة لمعظم السيناريوهات. ومع ذلك، إذا كان التطبيق يتطلب تأمينات محددة تتحكم تماما في الصفوف المتأثرة وبمستوى تأمين معين، فإن أوضاع التأمين الصريحة تمكن عنصر التحكم الدقيق هذا.

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

على سبيل المثال، يمكن لمعاملتين الاستعلام عن نفس البيانات في نفس الوقت باستخدام عبارة SELECT. ستستخدم هذه الطلبات تأمين ACCESS SHARE وسيتم السماح بكليهما. في سيناريو آخر، تقوم معاملة واحدة بالاستعلام عن البيانات باستخدام عبارة SELECT وتأمين ACCESS SHARE، ولكن في نفس الوقت تحاول معاملة أخرى إسقاط نفس الجدول. يتطلب إسقاط جدول تأمين ACCESS EXCLUSIVE، والذي لن يتم منحه، في هذا السيناريو.

تأمين على مستوى الجدول

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

هناك ثمانية أنواع من التأمين على مستوى الجدول في قاعدة بيانات Azure ل PostgreSQL والأوامر SQL التي تحصل على هذه الأنواع من التأمينات هي:

وضع التأمين تم الحصول عليه من قبل
الوصول إلى المشاركة الأمر SELECT
مشاركة الصف SELECT FOR UPDATE و SELECT FOR SHARE commands
صف خاص أوامر UPDATE وDELETE وINSERT
مشاركة التحديث الحصري تحليل وإنشاء فهرس في وقت واحد وإنشاء إحصائيات والتعليق على أوامر REINDEX في وقت واحد وبعض أوامر ALTER INDEX وALTER TABLE والتفريغ (غير كامل)
سهم الأمر "إنشاء فهرس" (وليس بشكل متزامن)
مشاركة صف خاص الأمر "إنشاء مشغل" وبعض أوامر ALTER TABLE
خاص الأمر "تحديث طريقة العرض المجسدة بشكل متزامن"
الوصول الحصري أوامر DROP TABLE و REINDEX و TRUNCATE و CLUSTER و REFRESH MATERIALIZED VIEW (وليس بشكل متزامن) ومعظم أوامر ALTER INDEX وALTER TABLE وC VACUUM FULL

يحظر كل نوع من أنواع التأمين الموجودة التأمينات الأخرى المطلوبة التي يتم الحصول عليها. يسرد الجدول التالي التأمينات التي تمنع الحصول على تأمينات أخرى:

-- مشاركة ACCESS الحالية مشاركة الصف الموجودة صف خاص موجود تحديث SHARE الحالي حصري مشاركة موجودة قائمة EXCL لصف المشاركة الموجودة حصري موجود الوصول الحصري الحالي
مشاركة ACCESS المطلوبة مسدود
مشاركة الصف المطلوبة مسدود مسدود
صف خاص مطلوب مسدود مسدود مسدود مسدود
تحديث مشاركة مطلوب حصري مسدود مسدود مسدود مسدود مسدود
المشاركة المطلوبة مسدود مسدود مسدود مسدود مسدود
صف المشاركة المطلوب خاص مسدود مسدود مسدود مسدود مسدود مسدود
مطلوب خاص مسدود مسدود مسدود مسدود مسدود مسدود مسدود
تم طلب الوصول الحصري مسدود مسدود مسدود مسدود مسدود مسدود مسدود مسدود

تأمينات على مستوى الصف

تكون عمليات تأمين مستوى الصف أكثر دقة وتؤثر فقط على معاملة أخرى تصل إلى الصف نفسه. يحسن نوع التأمين هذا التزامن، ولكن الحصول على العديد من التأمينات وإسقاطها يؤثر سلبا على الأداء. يتم الحصول على الأقفال على مستوى الصف تلقائيا بواسطة PostgreSQL ولا يتم تطبيقها يدويا.

هناك أربعة أنواع من التأمين على مستوى الصف في قاعدة بيانات Azure ل PostgreSQL ويتم الحصول عليها اعتمادا على أنواع التأمين الأخرى التي يجب حظرها:

-- موجود ل KEY SHARE موجود ل SHARE موجود من أجل عدم وجود تحديث رئيسي موجود للتحديث
مطلوب لمشاركة المفتاح مسدود
مطلوب للمشاركة مسدود مسدود
مطلوب من أجل عدم وجود تحديث رئيسي مسدود مسدود مسدود
مطلوب للتحديث مسدود مسدود مسدود مسدود

تأمين على مستوى الصفحة

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

تطبيق الأقفال وعرض الأقفال الحالية يدويا

لتطبيق تأمين على مستوى الجدول يدويا، يمكنك استخدام الأمر LOCK مع وضع التأمين المطلوب. يجب أن يكون الأمر LOCK ضمن معاملة ويتم تحرير التأمينات عند اكتمال المعاملة. على سبيل المثال:

BEGIN TRANSACTION;
LOCK TABLE humanresources.department IN ROW EXCLUSIVE MODE;
COMMIT;

لعرض التأمينات الموجودة حاليا على قاعدة البيانات، استخدم pg_locks. على سبيل المثال، لعرض كافة التأمينات الحالية، استخدم الأمر التالي:

SELECT * FROM pg_locks;