سؤال

لقد قمت بالترقية من SQL Server 2005 إلى 2008. أتذكر أنه في عام 2005 ، لم ينجح Rowlock ببساطة واضطررت إلى استخدام Pagelock أو Xlock لتحقيق أي نوع من القفل الفعلي. أعرف أن قارئًا لهذا يسأل "ماذا فعلت خطأ؟" لا شئ. لقد أثبتت بشكل قاطع أنه يمكنني تحرير صف "Roolocked" ، لكن لم أستطع إذا تصاعدت مستوى القفل. لم تتح لي الفرصة لمعرفة ما إذا كان هذا يعمل في SQL 2008. سؤالي الأول هو هل صادف أي شخص هذه القضية في عام 2008؟

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

لتوضيح المبدأ ، هل سيعمل الكود التالي؟

BEGIN TRAN

SELECT      ProfileID
FROM        dbo.UseSessions
WITH        (ROWLOCK)
WHERE       (ProfileID = @ProfileID)
OPTION      (OPTIMIZE FOR (@ProfileID UNKNOWN))

if @@ROWCOUNT = 0 begin
    INSERT INTO dbo.UserSessions (ProfileID, SessionID)
    VALUES      (@ProfileID, @SessionID)
end else begin
    UPDATE      dbo.UserSessions
    SET         SessionID = @SessionID, Created = GETDATE()
    WHERE       (ProfileID = @ProfileID)
end

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

المحلول

تفسير...

  • Rowlock/Pagelock
  • Xlock هو الوضع

الحبيبية وعزل مستوى ووضع متعامد.

  • التفاصيل = ما هو مغلق = صف ، صفحة ، جدول (PAGLOCK, ROWLOCK, TABLOCK)

  • مستوى العزلة = مدة القفل ، التزامن (HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE)

  • الوضع = المشاركة/التفرد (UPDLOCK, XLOCK)

  • "مجتمعة" على سبيل المثال NOLOCK, TABLOCKX

كان Xlock قد أغلق الصف حصريًا كما تريد. Rowlock/Pagelock لن يكون لها.

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