کنترل همروندی چندنسخه‌ای

کنترل همروندی چندنسخه‌ای (Multiversion Control Concurrency)، در زمینه پایگاه داده علوم رایانه، یک روش کنترل همروندی است که معمولاً توسط سامانه‌های مدیریت پایگاه داده برای ارائه دسترسی همروند به پایگاه داده استفاده می‌شود، و همچنین در زبان‌های برنامه‌نویسی برای پیاده‌سازی حافظه تراکنشی به کار می‌رود.
بدون کنترل همروندي، اگر کسی در حال خواندن از یک پایگاه داده باشد و همزمان شخص دیگری در آن بنویسد، ممکن است خواننده یک قطعه داده‌اي كه كامل نوشته نشده یا متناقض است را ببیند. به‌طور مثال، هنگام انتقال داده بین دو حساب بانکی اگر خواننده، زمانی که پول از حساب اصلی حذف شده و قبل از ذخيره شدن در حساب مقصد، ميانگين حساب را از بانك بخواند، به نظر می‌رسد که پول در بانك ناپديد شده‌است. انزوا (isolation) يك ويژگي است كه دسترسيهاي همروند به داده را تضمین مي‌كند. انزوا با استفاده از معنا و مفهوم پروتکلهاي کنترل همروندي پياده سازي می‌شود. ساده‌ترین راه این است که همه خوانندگان منتظر بمانند تا نوشتن انجام شود، که به عنوان یک قفل خواندن - نوشتن شناخته می‌شود. قفل‌ها باعث ایجاد درگيري مي‌شوند به خصوص بین تراكنشهاي خواندن طولانی و تراكنشهاي به روز رساني. هدف MVCC، حل مشکل با نگه داشتن چندین نسخه از هر یک از داده‌ها است. بدین ترتیب، هر کاربری که به پایگاه داده متصل است، یک تصوير (snapshot) از پایگاه داده را در یک لحظه خاص در زمان می‌گیرد. هر گونه تغییری که توسط یک نویسنده ایجاد شده، توسط سایر کاربران پایگاه داده تا زمانی که تغییرات تکمیل نشده باشد (یا در شرایط پایگاه داده: تا زمانی که تراکنش كامل شود) مشاهده نمی‌شود.
هنگامی که یک پایگاه داده MVCC یک قطعه از داده را به روز رسانی مي‌كند، داده اصلي را با داده جديد جايگزين نخواهد كرد بلكه يك نسخه جديد از آن داده ايجاد مي‌كند. بنابراین چندین نسخه از داده ذخیره مي‌شود. نسخه ای که هر تراکنش مشاهده می‌کند به سطح انزواي اجرا شده (isolation level) بستگی دارد. شایع‌ترین سطح جداسازی با MVCC، جداسازي فوري (snapshot isolation) است. با سطح جداسازي فوري، یک تراکنش وضعیت داده را به عنوان زمان انجام تراكنش تراكنش مشاهده می‌کند. MVCC چالش چگونگی حذف نسخه‌هایی را که منسوخ شده و هرگز خوانده نخواهد شد معرفی می‌کند. در بعضی موارد، یک فرآیند به صورت دوره ای از طریق حذف و حذف نسخه‌های منسوخ اجرا می‌شود. این اغلب یک فرآیند توقف كلي است که یک جدول کامل را پردازش می‌کند و آن را با آخرین نسخه هر یک از آیتم‌های داده بازنویسی می‌کند. PostgreSQL با استفاده از فرآیند VACUUM حذف نسخه هاي منسوخ شده را انجام مي‌دهد.
پایگاه‌های داده‌های دیگر بلوک‌های ذخیره‌سازی را به دو قسمت تقسیم می‌کنند: بخش داده و Undo log . بخش داده همیشه آخرین نسخه كامل شده را نگه می‌دارد. Undo log امکان بازسازی نسخه‌های قدیمی تر داده‌ها را فراهم می‌کند. محدودیت اصلی ذاتی این رویکرد دوم این است که وقتی باركاري بروزرسانی بيشتري وجود دارد، بخشی از undo log نمي تواند اجرا شود و پس از آن تراكنش‌ها به دلیل عدم توانايي در گرفتن تصوير از پايگاه داده قطع می‌شوند. برای یک پایگاه داده سند-گرا همچنین اجازه می‌دهد تا سیستم به منظور بهینه سازی اسناد با نوشتن تمام اسناد به بخش‌های مجاور دیسک، هنگامی که به روز شده، کل سند قابل بازنويسي مي شود به جاي آن كه بيتها و تكه‌ها جدا شوند يا در ساختار پايگاه داده پيوسته مرتبط نگهداري شوند.
MVCC دیدگاه‌های سازگار با زمان لحظه اي فراهم می‌کند . تراكنشهاي خواندن تحت MVCC برای تعیین وضعیتي از بانک اطلاعاتی كه بايد خوانده شود، به‌طور معمول از یک نشانگر زمان (time stamp)یا شناسه تراکنش استفاده می‌کنند و اين نسخه از داد ه‌ها را مي خوانند. بنابراین، تراكنشهاي خواندن و نوشتن بدون نیاز به قفل شدن از یکدیگر جدا می شوند. با این حال، علیرغم ضروري نبودن قفل، در بعضی از پایگاه‌های داده MVCC مانند اوراکل استفاده می‌شود. نوشتن، یک نسخه جدیدتر ایجاد می‌کند در حالی که خواندن همزمان با آن، به یک نسخه قدیمی دسترسی پیدا می‌کند.