PDA

View Full Version : کاربرد کلمه NoLock چیست؟



آرام جان گل
دوشنبه 19 اردیبهشت 1390, 09:46 صبح
سلام
کاربرد کلمه NoLock و ReadPast در در کویری های زیر چیست؟



SELECT COUNT(*) FROM SalesHistory WITH(NOLOCK)




SELECT COUNT(*)
FROM SalesHistory WITH(READPAST)


ممنون راهنمایی کنید

vahid_1360
دوشنبه 19 اردیبهشت 1390, 16:51 عصر
سلام
دوست عزیز من این جمله را در google زدم و جواب را فهمیدم sql : what means WITH(NOLOCK)
این مورد بیشتر در مورد کار برروی شبکه معنی می دهد و این امکان را می سازد که زمانی که کسی این پرسش (query) را انجام می دهد اطلاعات نمایش داده شده توسط کاربر دیگری تغییر نکند(اصلاح یا حذف نشود)

AminSobati
دوشنبه 19 اردیبهشت 1390, 21:13 عصر
سلام دوست عزیزم،
nolock باعث میشه Query شما معطل هیچ Lockی نشه ولی رکوردهای در حال ویرایش رو به شما نمایش میده در حالیکه ممکنه ویرایشها Rollback بشن پس شما Dirty Read انجام دادین. استفاده از nolock در همه گزارشها توصیه نمیشه چون عمدتا Dirty Read مطلوب نیست.
read past باعث میشه Query از رکوردهایی که lock هستند عبور کنه پس شاید همه رکوردها رو نبینین

آرام جان گل
سه شنبه 20 اردیبهشت 1390, 09:33 صبح
سلام
ممنون از دو دوست عزیز

سوالی که برام پیش اومد :
اگر دستور ReadPast از روی رکورد های Lock شده عبور می کنه و اونها را در نظر نمی گیره چه تفاوتی بین یک کویری ساده با یک کویری با دستور ReaPast است؟

تفاوت دو دستور زیر چیه؟



SELECT COUNT(*)FROM SalesHistory WITH(READPAST)





SELECT COUNT(*)FROM SalesHistory


ممنون راهنمایی کنید

MOJTABAATEFEH
سه شنبه 20 اردیبهشت 1390, 13:05 عصر
دوست عزیز sql تا حدودی عملیات قفل گذاری رو در Transaction ها انجام میده و با عمل بالا شما پیشنهاد قفل دیگری رو به sql میدین ولی دقت داشته باشید واقعا در مواقع لزوم از قفل گذاری داده ها استفاده کنید و برحسب نیاز از انواع قفل گذاری استفاده نمایید مثلا بیخود از قفل های سطح جدول استفاده نکنید چون کاربرهای دیگر معطل می مانند و اینکه استفاده زیاد از قفل ها باعث بروز Deadlock (گره کور) میشه البته در نسخه های جدید sql قبل از وقوع گره کور sql تشخیص میده و جلوگیری می کنه ولی به هر حال امکان وقوعش با استفاده زیاد از قفل ها بالا میره

موفق باشید

AminSobati
سه شنبه 20 اردیبهشت 1390, 13:58 عصر
سلام
ممنون از دو دوست عزیز

سوالی که برام پیش اومد :
اگر دستور ReadPast از روی رکورد های Lock شده عبور می کنه و اونها را در نظر نمی گیره چه تفاوتی بین یک کویری ساده با یک کویری با دستور ReaPast است؟

تفاوت دو دستور زیر چیه؟



SELECT COUNT(*)FROM SalesHistory WITH(READPAST)





SELECT COUNT(*)FROM SalesHistory


ممنون راهنمایی کنید

در مورد Count، ممکنه SQL Server از ایندکسی استفاده کنه که Lock نشده و تعداد رکوردها در حالی که ReadPast دارین و ندارین یکسان بشه. اما وقتی یکی از رکوردهای جدول Lock شده و شما میخوان رکوردها رو بخونین (بدون Count)، استفاده نکردن از ReadPast باعث منتظرماندن Query خواهد شد در حالیکه با ReadPast جواب بدست میاد اما رکوردهای Lock شدن دیده نخواهند شد