لماذا يتم تشغيل WITH NOLOCK كـ Serializable
-
29-09-2020 - |
سؤال
قمت بتشغيل الاستعلام التالي:
SELECT session_id,CASE transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN 'ReadUncommitted'
WHEN 2 THEN 'ReadCommitted'
WHEN 3 THEN 'Repeatable'
WHEN 4 THEN 'Serializable'
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL
FROM sys.dm_exec_sessions
Where transaction_isolation_level = 4
وثم:
DBCC INPUTBUFFER(157)
حيث كان 157 أحد الجلسات السابقة ، لمشاهدة بيان إحدى نتائج الاستعلام رقم.1.
أظهرت ما يلي:
(@ID uniqueidentifier) SELECT * FROM PS WITH (NOLOCK) WHERE ID = @ID
كيف يمكن تشغيل العبارة التي تستخدم WITH (NOLOCK)
بمستوى العزل Serializable؟هل هناك أي شيء "يتجاوز" With (NOLOCK)
؟
المحلول
تلميحات القفل متعامدة مع مستوى العزل.بينما يعالجون مخاوف مماثلة ، فإن إضافة تلميح قفل لا يغير مستوى العزل.ستظل معاملتك معاملة "قابلة للتسلسل".بالطبع ، يجعل تلميح القفل عملية الاستعلام نفسها تنتهك قابلية تسلسل المعاملة ، لكنك تبحث في خاصية المعاملة .
نصائح أخرى
يقوم الاستعلام الخاص بك بالإبلاغ عن الإعداد على مستوى الجلسة لمستوى عزل المعاملة ، والذي تم تعيينه على التسلسل.
يؤدي استخدام تلميح NOLOCK
(أو مرادفه READUNCOMMITTED
) إلى تجاوز مستوى عزل الجلسة للوصول إلى الكائن المحدد (الجدول في هذه الحالة) الذي تم تحديد التلميح عليه.
لذلك ، لا تزال المعاملة قيد التشغيل في ظل عزل قابل للتسلسل ، ولكن سيتم إجراء الوصول إلى الجدول PS باستخدام READUNCOMMITTED
دلالات عزل.
توثيق:
- \ن
- SET TRANSACTION ISOLATION LEVEL (Transact-SQL) \ن
- تلميحات الجدول (Transact-SQL) \ن
- sys.dm_exec_sessions \ن
القراءة ذات الصلة:
- \ن
- مستويات عزل SQL Server: سلسلة A (أنا المؤلف) \ن