بررسی مکانیزم های کنترل همروندی در DBMS های مختلف
دراین مطلب قصد دارم کنترل همروندی را در چند DBMS مختلف بررسی کنم. این مطلب منطبق بر کتاب پایگاه داده سیلبرشاتس، فصل کنترل همروندی می باشد. DBMS های بررسی شده عبارتند از: Oracle، MongoDB، PostgreSQL و SQL Server . موارد بررسی شده در این نوشته شامل: ۱) مکانیزم کنترل همروندی پیش فرض هر DBMS و ۲) فهرست مکانیزم هایی که پشتیبانی می کند.
بررسی اوراکل : مکانیزم کنترل همروندی پیش فرض اوراکل مطابق کنترل های همروندی چندنسخه ای (MVCC) که در فصل 18 خواندیم یک پیاده سازی بومی از این کنترل ها است – بدین صورت که هر تراکنش هنگام اجرای عملیات خواندن، اسنپ شات سازگاری از داده ها را مشاهده می کند و بنابراین 1) خواندن ها و نوشتن ها یکدیگر را مسدود نمی کنند و 2) هیچ پدیده ای مانند dirty read رخ نمی دهد.
Oracle از اغلب تکنیک های استاندارد کنترل همروندی که در فصل 18 معرفی شده اند پشتیبانی می کند مانند: قفل گذاری سطح row ، سطوح انزوا شامل Read Committed و Serializable (بر مبنای snapshot) ، کنترل بدبینانه در برخی عملیات، تشخیص بن بست بر اساس گراف انتظار (Wait-for Graph) و در آخر پشتیبانی ضمنی از خوش بینانه بودن برای خواندن ها بر اساس نسخه های متعدد (مطابق Multiversion Validation)
بررسی مونگو : مکانیزم کنترل همروندی پیش فرض MongoDB را می توان ترکیبی از مدل های قفل گذاری ریزدانه و کنترل همروندی چندنسخه ای دانست. قفل گذاری در سطح سند (Document-Level Locking) و MVCC داخلی موتور WiredTiger و سیاست های خوش بینانه برای اجرای بسیاری از به روزرسانی ها را به کار می گیرد.
مجموعه روش های پشتیبانی شده توسط MongoDB عبارتند از: قفل گذاری در سطح سند ،Optimistic Concurrency Control(بر پایه نسخه سند: update-if-current) ، Snapshot isolation در تراکنش های ACID ، پایایی و هماهنگی بر پایه Majority Write Concern، مدل علیتی (Causal Consistency) که در بخش های مربوط به سیستم های توزیع شده مطرح شده است و Linearizable Reads که نوعی تضمین قوی سازگاری است.
PostgreSQL یکی از دقیق ترین پیاده سازی های کنترل همروندی چندنسخه ای را دارد. مطابق فصل کنترل همروندی، از مدل Snapshot Isolation به عنوان رفتار پیش فرض برای خواندن ها استفاده می کند. یعنی 1) تراکنش خواننده هیچ گاه توسط نویسنده مسدود نمی شود و 2) نسخه های قدیمی داده تا پایان تراکنش حفظ می شوند.
مجموعه روش های پشتیبانی شده توسط PostgreSQL علاوه بر نسخه پیش فرض عبارتند از: Serializable Snapshot Isolation (SSI) که یکی از پیشرفته ترین پیاده سازی های سریال پذیری است، مطابق مونگو قفل گذاری در سطح ردیف، قفل گذاری در سطح جدول، Predicate locking، قفل های مشورتی (Advisory Locks) و در آخر الگوریتم های نزدیک به کنترل خوش بینانه با استفاده از نسخه های Xmin/Xmax
SQL Server برخلاف Oracle و PostgreSQL، به صورت بدبینانه و مبتنی بر قفل گذاری (Lock-Based Concurrency Control) عمل می کند. این دقیقا همان مدل Two-Phase Locking ذکر شده در فصل کنترل همروندی است.
در حالت پیش فرض سیستم از قفل های چندسطحی (Row, Page, Table) استفاده می کند. رفتار خواندن منطبق با Read Committed مبتنی بر قفل است.
علاوه بر مدل پیش فرض، روش های دیگری که SQL Server پشتیبانی می کند عبارتند از: Snapshot Isolation (MVCC) که غیرفعال است و در صورت نیاز باید فعال شود، Read Committed Snapshot Isolation (RCSI) ، قفل گذاری در سطوح مختلف که مفهوم ریزدانه و درشت دانه را در بر می گیرد، Intent locks برای سلسله مراتب قفل ها، Key-range lockingبرای پیاده سازی سریال پذیری، Optimistic Concurrency با rowversion و در نهایت تشخیص بن بست با گراف انتظار
