تا حالا به این فکر کردی که دیتابیس چطوری میتونه کاملا همزان یک رکورد رو آپدیت کنه و بخونه؟!! خیلی عجبیه نه؟!
یکی از راه هایی که دیتابیس ها برای حل این مشکل استفاده میکنن multi-version concurrency control هستش که قراره خیلی خلاصه با یک مثال توضیحش بدم.
جدول زیر میزان بونس هر فرد رو ذخیره کرده:
فرض کن در به صورت همزمان دو نفر نفر یک کوئری select روی رکورد آخر به صورت کاملا همزمان میزنن
از اونجایی select ماهیت read داره پس lock اتفاق نمیفته و هر دو نفر خروجی مدنظرشون رو میگیرن ولی فرض کن حالا نفر سومی هم اضافه میشه و قبل از اینکه اون دو نفر کوئری بزنن این فرد یک کوئری update میزنه بدین شکل
UPDATE Account SET Bonus = 2000 WHERE ID = 455332
در اون لحظه رکورد شماره سه lock میشه و کسی تا زمان آزاد شدن این lock نمیتونه روی اونکوئری بزنه حتی select!
اما این موضوع خیلی جالب نیست چون به خاطر update یک نفر دیگه تو نمیتونی select بزنی و دیتا رو صرفا بخونی و به اصطلاح هیچ write ی نداری و باید تا اتمام اون کوئری منتظر بمونی :(
دقیقا همینجاست که MVCC مشکل رو با یک Version حل میکنه
اما چجوری؟
دیتابیس به هر رکورد شما داخل جدول یک Version اختصاص میده (میتونه time stamp باشه یا هرچیز دیگه که بستگی به نوع دیتابیس داره) و توی هر کوئری select رکوردی رو میاره که آخرین ورژن رو داره.
موقعی که نفر سوم داره update میکنه رکورد سوم رو دیتابیس بجای اینکه اون رکورد رو lock بکنه میاد یک کپی از اون رکورد میسازه و تغییراتش رو داخل اون میده و همچنین یک نسخه ورژن رو میبره بالاتر حالا وقتی اون دو نفر select میزنن در واقع رکوردی رو میگیرن که هنوز آپدیت نشده و ورژنش عقبه اما به محض اینکه transaction به اصطلاح commit بشه و اون رکورد جدید با ورژن جدید بیاد داخل جدول دفعه بعد که کاربرها select بزنن این دفعه رکورد آپدیت شده با ورژن جدید رو میبینن. این خلاصه کار MVCC داخل دیتابیس هاست ولی اگه دوست داری بیشتر بدونی حتما به این لینک سر بزن :)
MVCC In Wikipedia