MVCC

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

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

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

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

Реалізація[ред. | ред. код]

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

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

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

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

Примітки[ред. | ред. код]

  1. Clojure - Refs and Transactions. clojure.org. Процитовано 2019-04-12. 
  2. Ramakrishnan, R., & Gehrke, J. (2000). Системи управління базами даних. Осборн / Макгроу-Хілл.