Контроль сумісності на основі часових позначок
Ця стаття не містить посилань на джерела. (листопад 2019) |
В інформатиці алгоритм керування кон'юнктурою на основі часових позначок є методом неблокуючий контроль сумісності[en]. Він використовується в деяких базах даних для безпечного опрацювання транзакцій, використовуючи мітки часу.
- Кожне значення позначки часу є унікальним і точно відображає мить у часі.
- Немає двох часових позначок, які не можуть бути однаковим.
- Часові позначки з високим значенням виникають пізніше, ніж часові позначки з нижчим значенням.
Для створення часових позначок було використано ряд різних способів
- Використовуйте значення годинника системи на початку транзакції, як часову позначку.
- Використовуйте захищений потоком спільний лічильник, який збільшується на початку транзакції, як часову позначку.
- Поєднання перерахованих вище двох методів.
Кожна транзакція () є упорядкованим списком дій (). Перед тим, як транзакція виконає свою першу дію (), вона позначається поточною часовою позначкою або будь-якою іншою послідовністю строго повністю впорядкованим: . Кожній транзакції також надається спочатку порожній набір транзакцій, від яких вона залежить, , і спочатку порожній набір старих об'єктів, який він оновив, . Кожному об'єкт у базі даних надаються два поля часових позначок, які не використовуються, крім для контролю одночасності: — час, коли значення об'єкта востаннє було використано транзакцією, — час, коли значення об'єкта востаннє оновлено транзакцією.
Для всіх :
- Для кожної дії :
- Якщо бажає використовувати значення :
- Якщо то скасувати (останній потік перезаписує значення),
- В іншому випадку оновіть набір залежностей та набір ;
- Якщо хоче оновити значення :
- Якщо то перервати (останній потік вже покладається на старе значення),
- Якщо то пропустити (Правила запису Томаса[en]),
- Інакше збережіть попередні значення, , встановіть , та оновити значення ,
- Якщо бажає використовувати значення :
- Поки є транзакція в , яка не закінчилася: почекати
- Якщо в є транзакція, яка перервала, тоді скасувати
- Інакше: здійснити.
До скасування:
- Для кожного in
- Якщо дорівнює тоді відновіть and
Щоразу, коли починається транзакція, вона отримує часову позначку. Ця часова марка вказує на порядок здійснення транзакції щодо інших транзакцій. Отже, враховуючи дві транзакції, які впливають на один і той же об'єкт, операція транзакції з попередньою часовою позначкою повинна виконуватися до початку операції з пізнішою часовою міткою. Однак якщо операція з помилковою транзакцією реально представлена спочатку, то вона переривається, і транзакція повинна бути перезапущена. Кожен об'єкт у базі даних має часову позначку читання, яка оновлюється кожного разу, коли дані об'єкта читаються, та часову позначку запису , яка оновлюється щоразу, коли дані об'єкта змінюються.
Якщо транзакція хоче прочитати об'єкт,
- але транзакція розпочалася перед об'єктом запис часової позначки, це означає, що щось змінило дані об'єкта після початку транзакції. У цьому випадку транзакцію скасовують і її потрібно перезапустити.
- і транзакція розпочалася після об'єкта тимчасової мітки запису, це означає, що безпечно читати об'єкт. У цьому випадку, якщо часова мітка транзакції стоїть після об'єкта часова мітка читання , часова мітка читання встановлюється як часова мітка транзакції.
Якщо транзакція хоче записати на об'єкт,
- але транзакція розпочалася перед об'єктом читати часову позначку, це означає, що щось подивилося на об'єкт, і ми припускаємо, що він взяв копію даних об'єкта. Таким чином, ми не можемо записати в об'єкт так, як це зробить будь-які скопійовані дані недійсними, тому транзакція перервана і повинна бути перезапущена.
- і транзакція розпочалася до позначки часу запису об'єкта, це означає, що щось змінило об'єкт з моменту початку транзакції У цьому випадку ми використовуємо правило написання Томаса[en] і просто пропускаємо нашу операцію запису і продовжуємо як звичайну транзакцію, яку не потрібно переривати або перезавантажувати
- в іншому випадку транзакція записується в об'єкт, а запис часової позначки об'єкта встановлюється як часова мітка транзакції.
Для пояснення термінів відшкодування, уникання каскадних абортів і строгого див. Розклад (інформатика)[en].
Зверніть увагу, що впорядкування часових міток у його базовій формі не призводить до відновлення історії. Розглянемо для прикладу наступну історію транзакцій і :
Це може бути створено планувальником TO, але не підлягає відновленню, оскільки виконує зобов'язання, навіть незважаючи на те, що він читав з незареєстрованої транзакції. Щоб переконатися, що вона створює історію, що підлягає відновленню, планувальник може зберігати перелік інших транзакцій, які кожна транзакція «читала з», і не дозволяти транзакції здійснюватись до того, як цей список складався з лише здійснених транзакцій. Щоб уникнути каскадних переривань роботи, планувальник може тегувати дані, записані невідправленими транзакціями, «брудними», і ніколи не дозволяти операції зчитування такого елементу даних, перш ніж вона була позначена тегом. Щоб отримати сувору історію, планувальник не повинен допускати жодних операцій з брудними предметами.
Це мінімальний час, що минув між двома сусідніми часовими позначками. Якщо роздільна здатність часової позначки занадто велика (груба), збільшується можливість рівних двох та більше часових позначок, що дозволяє деяким транзакціям здійснюватись із правильного порядку. Наприклад, якщо припустити, що у нас є система, яка може створити сто унікальних часових позначок в секунду, і враховуючи дві події, які трапляються на відстані 2 мілісекунд, їм, ймовірно, буде надана однакова мітка часу, навіть якщо вони насправді відбувалися в різний час.
Незважаючи на те, що ця техніка є незаблокованою, оскільки Об'єкт не заблокований від одночасного доступу протягом тривалості транзакції, акт запису кожної часової позначки проти Об'єкта вимагає надзвичайно короткої тривалості блокування на Об'єкт або його проксі.
На цю статтю не посилаються інші статті Вікіпедії. Будь ласка розставте посилання відповідно до прийнятих рекомендацій. |