it-swarm.asia

ما هو الحظر وكيف يحدث؟

حاولت العثور على بعض المعلومات حول الحظر في SQL Server ، ولكن لم أجد تفسيرًا موجزًا ​​لما هو وكيف يحدث. هل يمكنك تنويري من فضلك؟

20
jrara

المقارنات

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

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

يتم حظر الطفل الآخر من هذا المورد.

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

أقفال

إذا انتقلنا إلى عالم قاعدة البيانات ، فإننا نرى أن هناك طرقًا مختلفة لاستخدام الموارد (تمامًا مثل المثالين أعلاه). يمكننا أداء "يقرأ" أو يمكننا أداء "يكتب".

عندما نريد قراءة البيانات ، لا يوجد سبب يمنع الآخرين من قراءة البيانات أيضًا - تمامًا مثل شخصين يشاهدان التلفزيون. ومع ذلك ، إذا أردنا كتابة البيانات ، فعلينا التأكد من أنه لا يوجد شخص آخر ينظر إليها. إذا كانوا يقرؤونها بينما نكتبها ، فإنهم سيحصلون على قراءات "قذرة". (بمعنى ، سيرون البيانات مكتوبة جزئيًا ، والتي ستكون غير صالحة.)

من أجل ضمان عدم حدوث هذه القراءات القذرة ، لدينا نوعان أساسيان من الأقفال ، أقفال القراءة وأقفال حصرية.

قراءة القفل

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

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

قفل خاص

إذا كان هناك اتصال يريد تحديث/إدراج/حذف جزء من البيانات ، فيجب عليه قفل خاص. هذا يمنع أي اتصال آخر من إلغاء قفل البيانات (مما يجعل القفل حصريًا لذلك الاتصال).

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

المنع

يُعد "الحظر" ببساطة مصطلحًا يعني أن اتصالًا ما يحمل قفلًا على أحد الموارد عندما يرغب اتصال آخر في قراءته أو الكتابة إليه. هذا لا يعني بالضرورة أن اتصال المالك لن يفرج عنه ، فقط أنه يحمله حاليًا.

قارن هذا بالقضية مع طفل يمسك بالكرة. يمنع الطفل الذي يمسك بالكرة جميع الأطفال الآخرين من حمل الكرة.

طريق مسدود

أعلم أنك لم تطلب ذلك ، لكنها ليست سوى خطوة واحدة أخرى للوصول إلى طريق مسدود (وهي مرتبطة بشكل مباشر جدًا بالحظر).

يمكن أن تحدث حالات توقف تام عندما يكون لديك اتصالان لكل منهما قفل ، لكنهما يريدان موارد كل منهما. في هذا السيناريو ، يشبه طفلان أن لكل منهما كرة ، لكنه يريد كرة الآخر.

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

بمجرد الانتهاء من الاتصال "الفائز" ، فإنه يقوم بتحرير الموارد ومن ثم يمكن أن يحاول الاتصال الآخر ("المفقود") مرة أخرى الوصول إلى كلا الموارد.

لذا ، فإن مفهوم الجمود هو عندما يكون لديك اثنان من الموارد التي تحجب بعضها البعض.


هنا ، يمكنك قراءة المزيد حول جميع أنواع الأقفال المختلفة التي يقدمها SQL Server والموارد المختلفة التي يمكن أن تسبب الحظر/الجمود. المقالة قديمة ، لكنها ما زالت تنطبق على SQL Server 2000 حتى 2008 R2. (هناك عدد قليل من أنواع التأمين التي تمت إضافتها إلى الإصدارات الأحدث من SQL Server ، لكن ذلك سيعطيك نقطة بداية.)

23
Richard

شرح رائع من ريتشارد ، لكنه أراد فقط إضافة روابط للوثائق الرسمية. تمت كتابة هذه المواضيع لـ SQL Server 2000 ، لكن معظم المفاهيم تبقى كما هي اليوم:

فهم وتجنب الحظر

فهم القفل في SQL Server

تحرير - بعض الإضافات:

كل 3 من مؤلفي SQL Server و/أو MVPs معروفين.

5
Aaron Bertrand