Узгодженість бази даних також є одним із важливих показників для оцінки продуктивності СУБД. Наразі більшість комерційних баз даних (DB2, SQL Server) використовують протокол Two-Phase Locking (2PL) для контролю конкурентності, що забезпечує серіалізацію одночасного виконання транзакцій. Однак 2PL має заблокувати будь-які дані, перш ніж зможе читати або записувати на них. У матриці сумісності блокування блокування блокування S (Share Locks) і X блокування (ексклюзивні блокування) є несумісними, тому коли транзакція 1 виконує операцію зчитування даних A (плюс блокування S), а транзакція 2 хоче записатися у дані (додати блокування X), транзакція 2 має чекати, поки транзакція 1 звільнить блокування S на даних A, перш ніж продовжити. Багатоверсійний контроль конкурентності (MVCC) добре вирішує цю проблему. У багатоверсійній системі кожен запис генерує нову версію, і операція читання може читати відповідну версію за потреби, тому операції читання і запису не блокують одна одну. MVCC збільшує паралельність, але також додає накладні витрати на зберігання даних, пов'язані з підтримкою кількох версій.
Движок Microsoft SQL Server вводить нову реалізацію існуючого рівня ізоляції транзакцій — фіксовані читання, які надають знімки на рівні операторів за допомогою версіонування рядків. Движок бази даних SQL Server також вводить новий рівень ізоляції транзакцій — знімки для надання транзакційних знімків із використанням версійного налаштування рядків.
Встановлення опції READ_COMMITTED_SNAPSHOT бази даних на ON дозволяє ізоляцію комітованих читань за допомогою версування рядків. Встановлення опції ALLOW_SNAPSHOT_ISOLATION бази даних на ВКЛ дозволяє ізоляцію знімків. Коли будь-яка з опцій увімкнена для бази даних, рушій баз даних зберігає версію кожного рядка, який змінюється. Щоразу, коли транзакція змінює рядок, зображення рядка перед зміною копіюється на сторінку у сховищі версій. Сховище версій — це колекція сторінок даних у tempdb. Якщо є кілька ліній модифікації транзакцій, кілька версій цієї лінії будуть пов'язані в ланцюжок версій. Операція читання з використанням версіонування рядків отримує останню версію кожного рядка, яка була зафіксована на момент початку транзакції або оператора.
Додатки, написані для SQL Server 2008 або нові для SQL Server, реалізують ізоляцію читаних комітів за допомогою версування рядків, вказуючи рівень ізоляції транзакцій для читаних комітів, коли опція READ_COMMITTED_SNAPSHOT бази даних увімкнена. Усі читання будуть дивитися на версію рядка, яка була зафіксована на початку заяви. Це надасть знімок даних на рівні оператора.
Додатки, написані для SQL Server, реалізують ізоляцію знімків, вказуючи рівень ізоляції транзакцій знімків, коли опція ALLOW_SNAPSHOT_ISOLATION бази даних увімкнена. Усі читання у транзакції snapshot переглядають версію рядка, яка була зафіксована на момент початку транзакції. Це надасть транзакційний знімок даних.
Для транзакцій, що використовують рівні ізоляції на основі рядків, читання не запитують спільне блокування даних. Це означає, що читачі, які використовують версування рядків, не заважають іншим читачам або авторам отримати доступ до тих самих даних. Так само письменник не заважає читачеві. Однак письменники заважають один одному (навіть коли працюють на рівні ізоляції, заснованої на версіях рядків). Дві операції запису не можуть змінювати одні й ті ж дані одночасно.
Функція Snapshot Isolation розширює фреймворк блокування в SQL Server 2008, дозволяючи додаткам переглядати значення до будь-яких змін даних. Це запобігає блокуванню додатку, при цьому зберігаючи справді подані дані. Read Committed Snapshot у SQL Server 2008 вимагає активації адміністратора бази даних, що дозволяє читати дані транзакціями лише для читання. Отже, контроль SI за сумісністю транзакцій лише для читання дуже хороший, але незрозуміло, чи це стосується транзакцій оновлення. Більш невигідно, коли довготривалі транзакції з оновленнями конкурують із короткостроковими високорівневими транзакціями. Якщо транзакція між базами даних намагається використовувати стандарт Snapshot Isolation (SI), а не всі бази даних, транзакція зазнає невдачі. Це, без сумніву, створює певні перешкоди для масштабованості. Схоже, що Microsoft ще має довгий шлях до досягнення власного SI, який був би сильнішим за специфікацію SQL 92.
Перед будь-якою зміною зробіть копію попередньої версії, і всі наступні операції читання читатимуть скопійовану версію, а модифікація створить нову версію. Таким чином,Операції читання та запису не блокують одна одну. Перевага цього механізму версування рядків полягає в тому, що конкурентність програми відносно висока, але недолік у тому, що хоча користувач не читає брудні дані, це може бути значення даних, яке змінюється і ось-ось закінчиться. Якщо ви змінюєте дані на основі цього простроченого значення, це спричинить логічну помилку。
SQL-команди:
Посилання на посилання:
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
|