محتويات الدورة

SQL Server / المتوسط / الدرس 8

العزل والأقفال والقرارات المتزامنة

اشرح ما تراه الجلسات المتزامنة ولماذا قد يفشل استعلام صحيح منفرداً ضمن سير عمل. قارن READ COMMITTED بالأقفال وRCSI وSNAPSHOT والتحديث المتفائل.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تمييز اتساق العبارة والمعاملة.
  • تتبع تسلسل الحجب.
  • اختيار قاعدة تزامن وفق الثابت المطلوب.

حدد ما يجب أن يبقى مستقراً

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

يمنع READ COMMITTED القراءة غير المثبتة، لكن قد ترى عبارتان حالتين مثبتتين مختلفتين. يحمي REPEATABLE READ الصفوف المقروءة بصورة أقوى لكنه لا يمنع عموماً ظهور صفوف مطابقة جديدة. يضيف SERIALIZABLE حماية لمجالات المفاتيح المؤهلة وقد يزيد الحجب. العزل الأقوى مفاضلة مقصودة بين الصحة والإنتاجية لا تحسين أداء شامل.

تتبع الملكية والانتظار

تنسق الأقفال العمليات غير المتوافقة على موارد مثل المفاتيح والصفحات والمخطط. يحتفظ الكاتب عادة بحماية حصرية حتى نهاية المعاملة وفق نموذج SQL Server 2019 المستخدم هنا. وقد تنتظر جلسة أخرى بدلاً من الفشل فوراً. تفترض النصوص التصورية وجود dbo.TrainingStock في مختبر مخصص؛ ولا ترسلها إلى قاعدة تطبيق مضبوطة.

قد يحجب تحديث المنتج 7 في الجلسة A مع ترك المعاملة مفتوحة تحديث الجلسة B للمنتج نفسه. يسمح تثبيت A أو التراجع عنها بتقدم B وفق شرطها. هذا حجب باعتماد في اتجاه واحد، وليس تعارضاً دائرياً. راقب مالك المورد وسبب استمرار معاملته مفتوحة.

sql تسلسل حجب تصوري
-- Conceptual session A; requires a disposable lab table.
BEGIN TRANSACTION;
UPDATE dbo.TrainingStock SET Quantity=Quantity-1 WHERE ProductId=7;
-- Session B updating ProductId=7 may wait here.
ROLLBACK TRANSACTION;

لا يُتوقع زمن ثابت؛ تتأثر مساحة الأقفال بالخطة والفهارس والعمل المتزامن.

قارن RCSI وSNAPSHOT

يغيّر READ_COMMITTED_SNAPSHOT أو RCSI قراءات READ COMMITTED إلى نسخ الصفوف ويمنح اتساقاً على مستوى العبارة. يتيح ALLOW_SNAPSHOT_ISOLATION للجلسة طلب SNAPSHOT باتساق نسخ على مستوى المعاملة. هذان خياران منفصلان للقاعدة. يغير تمكينهما متطلبات الموارد والتشغيل، فلا يعد إصلاحاً محلياً عابراً للاستعلام. يفحص المثال حالتيهما فقط.

تقلل النسخ كثيراً من تعارضات القراء والكتّاب، لكن الكتّاب يظلون بحاجة إلى تنسيق وتبقى أقفال المخطط مهمة. قد تفشل تحديثات SNAPSHOT إذا تغير الصف بعد بدء اللقطة، ويتعين على التطبيق معالجة التعارض. تحتفظ المعاملات الطويلة بالنسخ وتستهلك مساحة. يقع سلوك القفل المحسن في SQL Server 2025 خارج أساس الدورة 2019؛ فلا تفترض تماثل مدة الأقفال بين الإصدارات.

sql فحص خيارات النسخ دون تغييرها
SELECT name,is_read_committed_snapshot_on,
 snapshot_isolation_state_desc
FROM sys.databases WHERE database_id=DB_ID();

يصف الصف إعداد القاعدة الفعلي؛ ولا يعني OFF وجود خطأ، فالخيار المناسب يتبع عقد العمل.

اكتشف تعديلات التطبيق القديمة

عمود rowversion رمز ثنائي يتغير تلقائياً وليس وقتاً على الساعة. أعده مع الصف واشترط الرمز الأصلي في شرط التحديث. إذا تغير الصف منذ قراءته فلن يعدل التحديث صفاً، ويمكن أن يطلب التطبيق إعادة التحميل أو الدمج. يمنع ذلك الكتابة الصامتة فوق تعديل محرر آخر.

استخدم المفتاح المستقر مع الرمز، وأعد الرمز الجديد عند النجاح. احتفظ به كبيانات ثنائية عبر المشغل. وقد يعني عدم تعديل صف أنه حُذف، لذا يهم تصميم الاستجابة. لا ينسق الرمز وحده ثابتاً يشمل عدة صفوف؛ استخدم استراتيجية معاملة تناسب العملية الكاملة.

تجنب اختصارات العزل

تسمح NOLOCK بقراءة غير مثبتة وغير متسقة، وليست علاجاً عاماً آمناً للحجب ولا ضماناً لغياب الأقفال. قد يحذف التقرير المالي بيانات أو يعدها مرتين مع نمط وصول غير مناسب. افحص أولاً مدة المعاملة ومسارات الوصول ومتطلبات الاتساق. تختلف حاجة شاشة مراقبة تقريبية مقصودة عن توافر المخزون.

اختبر التزامن بجداول جلسات مضبوطة وتنظيف صريح في بيئة مؤقتة. سجّل ما ينبغي أن تراه كل عبارة ومتى تنتهي المعاملة وأي إعادة محاولة مسموحة. قد يفوت اختبار نصين السباق إن لم يضبط تداخلهما. يجب أن يغطي تعليل الصحة تداخلاً فعلياً، لا نجاح تشغيلين متتابعين فقط.

الأخطاء الشائعة وإصلاحها

A user overwrote another edit.

لماذا يحدث؟
لم يفحص التحديث نسخة القراءة الأصلية.
كيف تصلحه؟
استخدم شرط المفتاح وrowversion وأبلغ عن تعارض الصفر.
كيف تتجنب تكراره؟
اختبر محررين متزامنين.

Snapshot isolation transaction failed due to update conflict.

لماذا يحدث؟
تغير الهدف بعد بدء اللقطة.
كيف تصلحه؟
تراجع وأعد العملية المؤهلة كاملة وفق سياسة محدودة.
كيف تتجنب تكراره؟
صمّم معالجة التعارض قبل تمكين SNAPSHOT.

NOLOCK produced inconsistent totals.

لماذا يحدث؟
سمح الاستعلام بقراءات غير مثبتة أو غير مستقرة.
كيف تصلحه؟
اختر نموذج اتساق موثقاً.
كيف تتجنب تكراره؟
راجع دقة القراءة كمتطلب.

اختبر فهمك

1. تنفذ عبارتا SELECT تحت RCSI قبل تثبيت معاملة أخرى وبعده. هل يجب تطابقهما؟

اعرض الحل المشروح

لا؛ يوفر RCSI لقطة مثبتة لكل عبارة، وقد ترى الثانية التثبيت الجديد. ولـ SNAPSHOT عقد على مستوى المعاملة عند تمكينه وطلبه.

2. يحدث العميل بالمفتاح وrowversion القديم دون تعديل صف. ماذا يفعل؟

اعرض الحل المشروح

يعاملها كتعارض أو حذف وفق عقد الواجهة. لا يكرر تحديثاً بلا شرط؛ بل يعيد القراءة أو يوفق التغييرات أو يعيد تعارضاً مع حفظ عمل الكاتب الآخر.

أهم ما تعلمته

  • اختر العزل وفق الثوابت المطلوبة.
  • يختلف نطاق الاتساق في RCSI وSNAPSHOT.
  • لا تلغي النسخ ورموز التفاؤل كل التنسيق.

المراجع الرسمية