سؤال

أستطيع أن أرى كيفية إيقاف تشغيل مستوى الصفوف وقفل مستوى الصفحة في SQL Server ، لكن لا يمكنني إيجاد طريقة لإجبار SQL Server على استخدام قفل مستوى الصف. هل هناك طريقة لإجبار SQL Server على استخدام قفل مستوى الصف وعدم استخدام قفل مستوى الصفحة؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام تلميح Rowlock ، ولكن قد تقرر AFAIK SQL تصعيده إذا كان يعمل على موارد منخفضة

من دوكو:

يحدد Rowlock أن أقفال الصفوف تؤخذ عند أخذ أقفال الصفحة أو الجدول عادةً. عند تحديدها في المعاملات التي تعمل على مستوى عزل اللقطة ، لا يتم أخذ أقفال الصفوف ما لم يتم الجمع بين Rowlock مع تلميحات جدول أخرى تتطلب أقفال ، مثل updlock و HoldLock.

و

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

وأخيرا هذا يقدم شرحًا متعمقًا حول تصعيد القفل في SQL Server 2005 والذي تم تغييره في SQL Server 2008.

هناك أيضا ، بعمق جدا: قفل في محرك قاعدة البيانات (في الكتب عبر الإنترنت)

لذلك ، بشكل عام

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

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

نصائح أخرى

استخدم بند ALTER_PAGE_LOCKS من تغيير/إنشاء فهرس:

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);

لا يمكنك حقًا إجبار المحسن على فعل أي شيء ، ولكن يمكنك توجيهه.

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

نرى - التحكم في خادم SQL مع قفل وتلميحات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top