User:BranchOfSin/sandbox

Керування паралельним доступом за допомогою багатоверсійності (MVCC — MultiVersion Concurrency Control) - це метод керування паралельним доступом, який зазвичай використовують системи керування базами даних (СКБД) та мови програмування, щоб реалізувати технологію транзакційної пам’яті.

Без керування паралельного доступа, якщо хтось зчитує данні бази данних в той же час, коли хтось записує, є можливість, що читач побачить наполовину написану або непослідовну інформацію. Наприклад, коли виконується банківський переказ між двома банківськими рахунками, то якщо читач подивиться баланс, коли гроші були зняті з оригінального рахунку та перед тим як вони були нараховані на потрібний рахунок, це буде виглядати нібито гроші зникли з банку. Ізоляція – це властивість, що гарантує паралельний доступ до даних. Ізоляція реалізується за допомогю протоколу керування паралельним доступом. Найпростішим методом буде змусити всіх читачів чекати поки записувач не закінчить, що відомо як блокуваня читання-запису. Такі блокування часто викликають суперечки, особливо між довгими транзацкіями читання та обновлення. Задумка MVCC в тому, щоб зберігати декілька копій кожного елементу даних. Таким чином, кожен користучав, що під’єднаний до бази даних в конкретний період часу бачить лише т.н. «знімок» бази даних. Будь-які зміни зроблені записувачем не будуть показані іншим користувачам поки зміни не будуть завершенні.

Коли база данних використувуюча MVCC потребує оновити елемент даних, вона не перепише оригінальний елемент данних новою інформацію, а створить новішу версію елементу даних. Таким чином зберігається декілька версій. Верся, що кожна транзакція бачить, залежить від того який рівень ізоляції реалізується. Найбільш часто з MVCC використовують т.н. «знімкову» ізоляцію. З такою ізоляцією, транзакція бачить стан інформації в той час, коли транзакція почалась. Але виникає проблема видалення версій, що стали застарілі та ніколи не будуть прочитані. В деяких випадках, виконується процес періодичної очистки застарілих версій. Зазвичай цей процес проходить через всю таблицю та переписує її останньою версією кожного елементу данних PostgreSQL використувиє цей підхід з його VACUUM процесом. Інші бази данних ділять блоки зберігання на дві частини: інформаційну та резервну. Інформаційна завжди зберігає останню версію. Резервна дає можливість відтворення більш старих версій даних. Основний недолік останнього підходу в тому, що при великій кількості оновлень, у резервної частини закінчується місце і транзакція припиняється, бо не може отримати її «знімок».

MVCC має узгоджені перегляди. Транзакції читання в MVCC зазвичай використовують мітку часу або ID транзакції, щоб визначити який стан БД прочитати, та прочитати версії цих даних. Транзакції написання та читання таким чином изольовані без потреби блокування.

Реалізація
MVCC використовує мітки часу та інкрементуючі ID транзакцій, щоб досягти узгодженість транзакцій. MVCC забезпечує те, що транзакції ніколи не буде потрібно чекати, щоб прочитати об’єкт бази данних завдяки зберіганню декількох версій об’єкту. Кожна версія об’єкту має мітку часу для читання та мітку часу для запису, що дозволяє конкретній транзакції прочитати останню версію об’єкту, яка існує перед міткою часу читаня.

Якщо транзакії 1 потрібно записати щось до об’єкту та в цей час існує інша транзакція 2 до цього об’єкту, то мітка часу читання першої транзакції повинна бути перед міткою часу читання другої транзакції, щоб операція запису відбулася вдачно. Запис не може бути зроблений, якщо існують транзакції у яких мітка часу читання раніше для цього ж об’єкту.

Тобто: кожен об’єкт має мітку часу, але якщо транзакція хоче записати щось до об’єкту і транзакція має мітку часу, що раніша ніж теперішня мітка часу читання об’екту, то транзакції відміняється та починається заново. ( Оскільки ця транзакція опирається на застаріле значення) В іншому випадку така транзакція створить нову версію об’єкту та встановить мітку часу запису/читання нової версії до мітки часу транзакції.

Недолік цієї системи в тому що, необхідно зберігати декілька версій об’єктів в базі даних. З іншой сторони, читання ніколи не блокується, що може бути важливам для роботи, що переважно потребує читання значень з бази даних. MVCC особливо майстерний в реалізації справжньої «знімкової» ізоляції, в той час як інші методи контролю паралельного доступу часто реалізують не повністю, або з високими витратами ресурсів комп’ютера.