SQL Server Rowlock عبر اختيار إن لم يكن موجودًا معاملة إدراج
-
30-09-2019 - |
سؤال
لقد قمت بالترقية من 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 لن يكون لها.