MVCC
Керування паралельним доступом за допомогою багатоверсійності (з англ. MVCC — MultiVersion Concurrency Control) - це метод керування паралельним доступом, який зазвичай використовується системами керування базами даних (СКБД) та в мовах програмування, щоб реалізувати технологію транзакційної пам’яті.[1]
Без керування паралельного доступу, якщо хтось зчитує дані бази даних в той же час, коли хтось записує, є можливість, що читач побачить напів написану або непослідовну інформацію. Наприклад, коли виконується банківський переказ між двома банківськими рахунками, то якщо читач подивиться баланс, коли гроші були зняті з оригінального рахунку та перед тим як вони були нараховані на потрібний рахунок, це буде виглядати нібито гроші зникли з банку. Ізоляція – це властивість, що гарантує паралельний доступ до даних. Ізоляція реалізується за допомогою протоколу керування паралельним доступом. Найпростішим методом буде змусити всіх читачів чекати поки записувач не закінчить, що відомо як блокування читання-запису. Такі блокування часто викликають суперечки, особливо між довгими транзакціями читання та обновлення. Задумка MVCC в тому, щоб зберігати декілька копій кожного елементу даних. Таким чином, кожен користувач, що під’єднаний до бази даних в конкретний період часу бачить лише т.н. «знімок» бази даних. Будь-які зміни зроблені записувачем не будуть показані іншим користувачам до їх завершення.
Коли база даних, що використовує MVCC, потребує оновити елемент даних, вона не перепише оригінальний елемент даних новою інформацією, а створить новішу версію елементу даних. Таким чином зберігається декілька версій. Версія, що кожна транзакція бачить, залежить від того який рівень ізоляції реалізується. Найбільш часто з MVCC використовують т.н. «знімкову» ізоляцію. З такою ізоляцією, транзакція бачить стан інформації в той час, коли ця транзакція почалась. Але виникає проблема видалення версій, що стали застарілі та ніколи не будуть прочитані. В деяких випадках, виконується процес періодичного очищення застарілих версій. Зазвичай цей процес проходить через всю таблицю та переписує її останньою версією кожного елементу даних. PostgreSQL використовує цей підхід з його VACUUM процесом. Інші бази даних ділять блоки зберігання на дві частини: інформаційну та резервну. Інформаційна завжди зберігає останню версію. Резервна дає можливість відтворення минулих версій даних. Основне обмеження останнього підходу в тому, що при великій кількості оновлень, у резервної частини закінчується місце і транзакції припиняються, бо не можуть отримати їх «знімок».
MVCC має узгоджені перегляди. Транзакції читання в MVCC зазвичай використовують мітку часу або ID транзакції, щоб визначити який стан БД прочитати, та прочитати ці версії даних. Транзакції написання та читання таким чином ізольовані без потреби блокування.
Реалізація
MVCC використовує мітки часу та інкрементуючі ID транзакцій, щоб досягти узгодженість транзакцій. MVCC забезпечує те, що транзакції ніколи не буде потрібно чекати, щоб прочитати об’єкт бази даних завдяки зберіганню декількох версій об’єкту. Кожна версія об’єкту має мітку часу для читання та мітку часу для запису, що дозволяє конкретній транзакції прочитати останню версію об’єкту, яка існує перед міткою часу читання.
Якщо транзакції 1 потрібно записати щось до об'єкта та в цей час існує інша транзакція 2 до цього об’єкту, то мітка часу читання першої транзакції повинна бути перед міткою часу читання другої транзакції, щоб операція запису відбулася вдало. Запис не може бути зроблений, якщо існують транзакції у яких мітка часу читання раніше для цього ж об’єкту.
Тобто: кожен об’єкт має мітку часу, але якщо транзакція хоче записати щось до об'єкта і транзакція має мітку часу, що раніша ніж теперішня мітка часу читання об'єкта, то транзакції скасовується та починається заново. ( Оскільки ця транзакція опирається на застаріле значення) В іншому випадку така транзакція створить нову версію об’єкту та встановить мітку часу запису/читання нової версії до мітки часу транзакції.[2]
Недолік цієї системи в тому що, необхідно зберігати декілька версій об’єктів в базі даних. З іншого боку, читання ніколи не блокується, тому що може бути важливим для роботи, що переважно потребує читання значень з бази даних. MVCC особливо майстерний в реалізації справжньої «знімкової» ізоляції, в той час як інші методи керування паралельним доступом часто реалізують її не повністю, або з високими витратами ресурсів комп’ютера.
Примітки
- Clojure - Refs and Transactions. clojure.org. Процитовано 12 квітня 2019.
- Ramakrishnan, R., & Gehrke, J. (2000). Системи управління базами даних. Осборн / Макгроу-Хілл.