Isolation Level در DB2
در مقاله های قبلی مربوط به قفل گذاری، درباره ی مفهوم Locking در DB2 صحبت کردیم. در این مقاله انواع Isolation level را معرفی خواهیم کرد.
جهت مطالعه ی انواع قفل در DB2، بر روی این لینک کلیک کنید.
DB2 روشی برای تغییر قفل گذاری در هر تراکنش یا SQL statement فراهم می کند. این روش از طریق Isolation Level صورت می گیرد و می تواند مربوط به یک یا چندین تراکنش باشد.
Isolation level در SQL را می توان با عبارت کلیدیِ
SET TRANSACTION ISOLATION LEVEL
تعریف کرد.
همچنین در SELECT Statement شما می توانید با عبارت With در انتهای دستور، Isolation Level یک دستور SQL را تعیین کنید.
Isolation Level نوع قفل گذاری بر روی Page یا رکورد را در حین اجرای برنامه مشخص می کند.
انواع Isolation Level:
در DB2 چهار نوع Isolation Level وجود دارد:
- Cursor stability – CS
- Repeatable read – RR
- Read stability – RS
- Uncommitted read – UR
Cursor Stability:
رایج ترین Isolation Level در اپلیکیشن های Production در DB2 می باشد، زیرا تعادل بسیار خوبی بین یکپارچگی داده و هم زمانی ارائه می دهد.
زمانی که CS تعیین شده است، یک تراکنش، هیچ داده ای که commit نشده است را نمی خواند. تنها داده های commit شده می توانند خوانده شوند. همانطور که می دانید در صورتی که تراکنش ها به مشکل برخورد کنند ممکن است کل یا قسمتی از تراکنش Rollback شود، در صورتی که اپلیکیشن ها داده ی commit نشده را بخوانند و بعد آن تراکنش Rollback شود، اپلیکیشن شما داده های نادرستی خواهد داشت.
Repeatable read:
سطح بالاترِ یکپارچگیِ داده توسط Repeatable read فراهم می شود. با Isolation Level نوع RR همه ی قفل های pageها تنها با انجام commit یا rollback آزاد می شوند. بر خلاف CS که به محض دسترسی به یک page، قفل pageهای قبلی آزاد می شود.
استراتژی قفل گذاری RR زمانی کمک کننده است که یک برنامه نیاز به ثبات در رکوردهایی دارد که ممکن است دو بار در یک اجرا به آن ها رجوع شود. یا یک برنامه به سطحی از یکپارچگی نیاز دارد که توسط CS به دست نخواهد آمد.
مثالی از دلایل استفاده از RR:
فرض کنید یک برنامه ی گزارش گیری داریم که یک جدول را اسکن می کند تا یک گزارش با جزئیات تولید کند. و سپس دوباره اسکن انجام می دهد تا یک گزارش مدیریتیِ خلاصه تولید کند.
اگر این برنامه از CS استفاده کند، نتایج گزارش اول ممکن است با نتایج گزارش دوم مطابقت نداشته باشد. چرا که ممکن است در حین تولید گزارش دوم، داده های گزارش اول تغییر کنند.
در حالی که با Isolation Level سطح RR، تا بعد از اتمام کامل برنامه و commit، اجازه ی هیچ دستکاری در جدول داده نمی شود.
مقاله ی ﻛﺎﻫﺶ ﻣﺸﻜﻼت درﮔﻴﺮى ﻗﻔﻞ ﻫﺎ در DB2 را می توانید در اینجا مطالعه نمایید.
Read stability:
سومین سطح، Read stability می باشد. RS در عملکرد به RR شباهت دارد اما با سخت گیری کمتر!
در این سطح، رکورد ها یا pageها تا انتهای unit of work قفل می مانند. هیچ برنامه ی دیگری تا زمان کامل شدن unit of work نمی تواند داده را تغییر دهد.
اما پروسه های دیگر می توانند داده هایی وارد کنند که ممکن است برنامه ی شما اگر برای بار دوم به رکورد قبلی رجوع کند آن را بخواند.
زمانی از RS به جای RR استفاده کنید که برنامه ی شما می تواند بازگشت تعداد رکوردهای متفاوتی را در هربار ایجاد cursor یا یک دستور SELECT مدیریت کند.
اگر از RS استفاده می کنید مطمئن شوید که برنامه ی شما وابسته به تعداد رکوردهای مشابه در هر خوانش نمی باشد.
Uncommitted read:
و در نهایت Isolation Level سطح Uncommitted read را داریم که به dirty read یا read uncommitted نیز شناخته می شود.
زمانی که شما از UR استفاده می کنید، یک برنامه می تواند داده هایی را بخواند که تغییر یافته اند اما هنوز commit نشده اند.
UR می تواند یک افزایش دهنده ی performance باشد چرا که برنامه هایی که با این Isolation Level اجرا می شوند داده را بدون داشتن قفل می خوانند. به این ترتیب برنامه می تواند داده های یک جدول را حتی در زمانی که در حال تغییر هستند نیز بخواند.
انتخاب استفاده از UR باید با دقت انجام شود زیرا می تواند باعث ایجاد مشکلاتی شود. برای مثال تعدادی رکورد در جدول در حال INSERT شدن می باشند و برنامه قبل از commit شدن، آن ها را می خواند. اما تراکنش INSERT با Rollback مواجه می شود و در نتیجه رکوردها در جدول ثبت نمی شوند. این باعث عدم یکپارچگی و صحت داده ها می شود.
توجه کنید که UR تنها برای عملیات های read-only مانند SELECT، SELECT INTO و یا FETCH استفاده می شود. عملیات های غیر read-only از Isolation Level سطح CS استفاده خواهند کرد.
برای DB2 DBA ها و application programmerها بسیار مهم است که این چهار سطح Isolation Level و تاثیر آن ها بر SQL را بشناسند. استفاده ی درست از Isolation Level یک راه موثر برای کنترل همزمانی و قفل گذاری در اپلیکیشن های DB2 می باشد.
1 دیدگاه. Leave new
ممنون مطلب مفیدی بود.