با سلام و احترام.
بنده به صورت اتفاقی به مشکلی برخوردم که مختصری از مساله و راه حل را جهت مستند سازی مساله بیان می کنم.
همه می دانیم که در زمان استفاده از SQL Server مکانیزمی جهت lock کردن جداول در زمان ورود اطلاعات و اخذ گزارش همزمان وجود دارد. به این صورت که اگر در حال اخذ گزارش (select) از جدولی باشیم، تا زمان پایان عملیات، امکان ورود اطلاعات یا ثبت اصلاحات در آن جدول وجود ندارد.
حال فرض کنید در یک وظیفه (WorkTask) ابتدا به کمک API داده ای در یکی از جداول مالی نوشته ایم و در ادامه می خواهیم از همان جدول، داده هایی را با کمک ADOSelect استخراج نماییم. در این شرایط با همان پدیده ی lock شدن جدول مربوطه مواجه می شویم. زیرا در طول این WorkTask، جدول مربوطه lock می باشد و بر خلاف تصور ما، پس از پایان API یا ADO، جدول lock شده آزاد نمی شود. بلکه پس از پایان WorkTask آن جدول آزاد می شود.
برای حل این مشکل، می شود در قسمت From و پس از نام جدول مربوطه، از عبارت WITH (READCOMMITTEDLOCK) استفاده کرد. در این صورت، پس از خوانش اطلاعات مربوطه، عمل lock شدن اتفاق نمی افتد. طبیعتا چنانچه از join استفاده کرده ایم، همین پارامتر را می توان پس از نام جداول join شده نیز اضافه نمود.
مثال:
select * from _transes WITH (READCOMMITTEDLOCK)
inner join _Arts WITH (READCOMMITTEDLOCK) on art_Key = tr_ArtKey
نکته: در صورت استفاده از این عبارت، ممکن است اطلاعاتی که ما خوانده ایم، قبل از استفاده در برنامه، در جدول اصلی دچار تغییر شود. زیرا پس از خوانش، آن جدول دیگر lock نیست و امکان اصلاح دارد. مثلا اگر WorkTask ما در مدت زمان 14 ثانیه اجرا شود، ممکن است در طول این مدت، داده هایی که ما 14 ثانیه پیش خوانده ایم، تا زمان استفاده، در سیستم مبدا تغییر کرده باشد.
پ.ن. از جناب آقای نجفی و نیکخواه برای کمک به حل مساله سپاسگزارم.