در سیستمهای پایگاه داده، اجرای همزمان چندین تراکنش یک موضوع اجتنابناپذیر است. کاربران مختلف بهطور همزمان دادهها را میخوانند یا تغییر میدهند و پایگاه داده باید به شکلی این همزمانی را مدیریت کند که هم کارایی حفظ شود و هم سازگاری دادهها از بین نرود. یکی از رویکردهای مهم برای حل این مسئله، مکانیزم کنترل همزمانی چندنسخهای یا MVCC (Multi-Version Concurrency Control) است.

در MVCC، بهجای اینکه هر تغییر مستقیماً روی داده موجود اعمال شود، یک نسخه جدید از داده ایجاد میشود. نسخه قبلی حذف یا بازنویسی نمیشود و تا زمانی که لازم باشد در سیستم باقی میماند. این ایده ساده باعث میشود که خواندن و نوشتن بتوانند بدون ایجاد مزاحمت جدی برای یکدیگر انجام شوند. در واقع، خواندنها معمولاً روی نسخههای قدیمیتر و پایدار داده انجام میشوند، در حالی که نوشتنها نسخههای جدید را تولید میکنند.
برای درک بهتر، فرض کنید رکوردی با مقدار balance = 100 در یک جدول وجود دارد. یک تراکنش این مقدار را میخواند و همزمان تراکنش دیگری مقدار آن را به 150 تغییر داده و commit میکند. در معماری مبتنی بر MVCC، تراکنش اول همچنان مقدار 100 را مشاهده میکند، چون این مقدار در زمان شروع تراکنش برای او معتبر بوده است. در مقابل، تراکنشهایی که بعد از commit تراکنش دوم شروع میشوند، مقدار 150 را خواهند دید. در این سناریو، هیچ نیازی نیست تراکنش خواننده منتظر تراکنش نویسنده بماند.
این رفتار معمولاً با اضافه کردن متادیتا به هر نسخه از رکورد پیادهسازی میشود. هر نسخه مشخص میکند توسط کدام تراکنش ایجاد شده و تا چه زمانی معتبر است. موتور پایگاه داده هنگام اجرای یک query بررسی میکند که کدام نسخه از هر رکورد با وضعیت فعلی تراکنش سازگار است و همان نسخه را در اختیار تراکنش قرار میدهد. به این ترتیب، هر تراکنش یک نمای سازگار از دادهها دریافت میکند، بدون اینکه درگیر تغییرات همزمان دیگر تراکنشها شود.
پایگاه داده هنگام اجرای یک query تصمیم میگیرد کدام نسخه از داده برای این تراکنش قابل مشاهده است. این تصمیمگیری معمولاً بر اساس زمان شروع تراکنش انجام میشود.
مزیت اصلی MVCC در افزایش همزمانی و کاهش قفلگذاریهای سنگین است. در بسیاری از workloadها، بهویژه سیستمهایی که تعداد خواندنها بیشتر از نوشتنهاست، این رویکرد باعث بهبود محسوس کارایی میشود. خواندنها تقریباً بدون بلاک شدن انجام میشوند و نوشتنها نیز با حداقل تداخل پیش میروند. با این حال، این مکانیزم هزینههایی هم دارد. نگهداری چند نسخه از دادهها فضای بیشتری مصرف میکند و پایگاه داده نیازمند فرآیندهایی برای پاکسازی نسخههایی است که دیگر توسط هیچ تراکنشی قابل استفاده نیستند.
در مجموع، MVCC یکی از پایههای اصلی طراحی پایگاه دادههای مدرن به شمار میرود. این مکانیزم با ایجاد چند نسخه از دادهها، امکان اجرای همزمان و کارآمد تراکنشها را فراهم میکند و تعادل مناسبی بین کارایی و سازگاری ایجاد میکند. اگرچه مفاهیمی مانند isolation levelها و snapshotها که در این مقاله مورد بررسی قرار داده ایم، نقش مهمی در درک کامل این رفتار دارند، اما حتی بهصورت مستقل نیز MVCC تصویر روشنی از نحوه مدیریت همزمانی در دیتابیسهای امروزی ارائه میدهد.