انواع قفل در SQL Server

SQL Server به منظور اطمینان از اینکه اطلاعات خوانده شدن، تغییر نخواهند کرد از مکانیزمی به نام Lock استفاده میکند. قفل ها این اطمینان را به ما میدهد که اطلاعاتی که در حال تغییر آنها هستیم، تحت تاثیر سایر تغییرات قرار نخواهد گرفت و اطلاعای که میخواهیم بخوانیم در حال تغییر به وسیله پردازش دیگری نیست. زمانی که در یک Connection جدولی قفل گذاری میشود، تا زمان آزاد شدن آن، سایر Connectionها اجازه قفل کردن و اعمال تغییرات روی آن جدول را به صورت همزمان ندارند. SQL Server شش نوع قفل دارد که عبارتند از:
Shared
Update
Exclusive
Intent
Schema
Bulk Update
4 نوع قفل اول این قابلیت را دارند که روی سطرهای جدول هم قرار داده شوند و 2 نوع آخر روی جدول قرار میگیرند.
Shared Locks:
این نوع قفل اجازه میدهد چندین Connection و تراکنش مختلف اطلاعاتی که روی آنها قفل گذاشه شده است بخوانند، اما اجازه تغییر این اطلاعات تا زمانی که این قفل روی آنها هست وجود ندارد. زمانی که اطلاعات خوانده شد، این قفل از روی اطلاعات
برداشته میشود، اما این شرایط ممکن است بنا به دلایلی تغییر کند. ممکن است در طول یک تراکنش این قفل روی اطلاعات نگه داشته شود، تا مطمئن شویم اطلاعاتی که بر پایه آنها داریم کار میکنیم در طول انجام عملیات ما تغییر نخواهد کرد. مثلا فرض
کنید قرار است از یک حساب بانکی 100 تومان برداشت شود، در آغاز کار چک میشود که موجودی حساب کافی باشد، اما باید شرایطی را ایجاد کنیم که تا زمان کامل شدن این عملیات، امکان تغییر مقدار پول موجود در حساب به وسیله سایر تراکنش ها
وجود نداشته باشد.
Update Locks:
از اتفاقات بدی که در برنامه نویسی می افتد و عموما ناشی از یک پیاده سازی بد میباشد، بن بست است، اگر 2 پردازش همزمان روی یک رکورد، قفل بگذارند و در انتها هر دو پردازش بخواهند آن رکورد را تغییر دهند، هر دو منتظر میمانند تا قفل از روی رکورد برداشته شود، اما این انتظار هرگز پایان نخواهد یافت و بن بست اتفاق می افتد، در این شرایط SQL Server بطور اتوماتیک پردازش کم ارزش تر را انتخاب میکند و آن را از بین میبر و خطای 1205 ارسال میکند و پردازش با ارزش تر میتواند کار خود را به پایان برساند.
برای جلوگیری از بن بست، SQL Server قفل جدیدی به نام Update Locks معرفی کرد که در بعضی شرایط میتواند جایگزین Shared Lock شود. تنها یک پردازش میتواند این نوع قفل را روی ردیف قرار دهد و اجازه نمیدهد سایر پردازش ها روی این ردیف قفل دیگری قرار دهند.
Exclusive Locks:
این قفل برای نویسنده های اطلاعات تعبیه شده است، هنگامی که قرار است اطلاعاتی در یک ردیف نوشته شود، این قفل روی آن ردیف قرار داده میشود و تا پایان نوشتن اطلاعات این قفل روی آن ردیف باقی می ماند.
Intent Locks:
این قفل برای پیشگری از قرار گرفتن بیش از یک قفل exclusive روی منبعی است که در حال حاضر یک قفل exclusive دارد. اگر شما یک رکورد را در یک جدول بخواهید Update کنید، روی ردیفی که در حال ویرایش آن هستید قفلی از جنس exclusive قرار میگیرد و قفلی از جنس intent روی جدولی که حاوی آن رکورد میباشد قرار میگیرد. برای روشن شدن این مطلب به مثال دقت کنید. فرض کنید شما به هتلی میروید و اطاق 404 از این هتل در اختیار شما قرار داده میشود. تا زمانی که این اتاق در اختیار
شماست هیچ کس نمیتواند به جز شما از آن اتاق استفاده کند. این یک قفل Exclusive است. شما یکی از اتاق های هتل را در اختیار داردید، پس صاحب هتل نمیتواند تمامی اتاق های هتل را هم به شخص دیگری اجاره دهد، چون یک اتاق مال شماست، این هم یک قفل Intent است.
Schema Locks:
دو نوع از این قفل در SQL Server وجود دارد. Sch - M که از دسترسی به اطلاعات جدول هنگامی که در حال تغییر جدول هستیم جلوگیری میکند. مثلا هنگامی که اعمالی مانند تغییر نام ستون ها یا کم و زیاد کردن ستون ها را انجام میدهیم. نوع دوم Sch- S است که از اعمال تغییرات روی جدولی که در حال دسترسی به داده های آن هستیم پیشگیری میکند.
Bulk Update Locks :
هنگامی که عملیات بارگذاری مقدار زیادی اطلاعات قرار است انجام شود از این نوع قفل استفاده میگردد و تا پایان عملیات، دسترسی به اطلاعات جدولی که این قفل روی آن قرار داده شده است، ممکن نیست.
منبع: کتاب Beginning_T-SQL_with_Microsoft_SQL_Server_2005_and_2008

0 نظرات: