Як говорить brb tea, залежить від реалізації бази даних та алгоритму, який вони використовують: MVCC або Two Phase Locking.
CUBRID (з відкритим кодом RDBMS) пояснює ідею цих двох алгоритмів:
- Двофазна блокування (2PL)
Перший - коли транзакція T2 намагається змінити запис A, вона знає, що транзакція T1 вже змінила запис A і чекає, поки транзакція T1 буде завершена, оскільки транзакція T2 не може знати, чи буде транзакція T1 здійснена або прокатана. назад. Цей метод називається двофазним блокуванням (2PL).
- Багатоверсійний контроль сумісності (MVCC)
Інший - дозволити кожному з них, транзакціям T1 і T2, мати власні змінені версії. Навіть коли транзакція T1 змінила запис A з 1 на 2, транзакція T1 залишає початкове значення 1 таким, яким він є, і пише, що версія транзакції T1 запису A дорівнює 2. Потім наступна транзакція T2 змінює запис A від 1 до 3, а не від 2 до 4, і пише, що версія транзакції T2 запису A дорівнює 3.
Коли транзакція T1 відкочується, не має значення, чи 2, версія транзакції T1, не застосовується до запису A. Після цього, якщо транзакція T2 здійснена, версія 3 транзакції T2 буде застосована до запису A. Якщо транзакція T1 здійснена до транзакції T2, запис A змінюється на 2, а потім на 3 під час здійснення транзакції T2. Остаточний стан бази даних ідентичний статусу виконання кожної транзакції незалежно, без впливу на інші транзакції. Тому він задовольняє властивість ACID. Цей метод називається багатоверсійним контролем одночасності (MVCC).
MVCC дозволяє проводити одночасні модифікації за рахунок збільшення накладних витрат у пам'яті (оскільки він повинен підтримувати різні версії одних і тих же даних) та обчислення (на рівні REPETEABLE_READ ви не можете втратити оновлення, тому він повинен перевіряти версії даних, наприклад Hiberate робить із блокуванням Optimistick Locking ).
У рівнях ізоляції транзакцій 2PL контролюються наступні :
Незалежно від того, чи приймаються блокування під час зчитування даних та тип запитів.
Як довго тримаються зачитувані блоки.
Будь операція читання, що посилається на рядки, змінені іншою транзакцією:
Блокуйте, поки не буде звільнений ексклюзивний замок ряду.
Отримайте скоєну версію рядка, яка існувала на момент початку заяви або транзакції.
Прочитайте неспроможну модифікацію даних.
Вибір рівня ізоляції транзакцій не впливає на блокування, придбані для захисту модифікацій даних. Транзакція завжди отримує ексклюзивний блокування будь-яких даних, які вона змінює та утримує, доки транзакція не завершиться, незалежно від рівня ізоляції, встановленого для цієї транзакції. Для операцій з читанням рівень ізоляції транзакцій насамперед визначає рівень захисту від впливу модифікацій, здійснених іншими транзакціями.
Нижчий рівень ізоляції збільшує можливість багатьох користувачів одночасно отримувати доступ до даних, але збільшує кількість ефектів одночасності , таких як брудні читання або втрачені оновлення, з якими можуть стикатися користувачі.
Конкретні приклади зв'язку між блокуваннями та рівнями ізоляції в SQL Server (використовуйте 2PL, за винятком READ_COMMITED з READ_COMMITTED_SNAPSHOT = ON)
READ_UNCOMMITED: не видайте спільні блокування, щоб запобігти іншим транзакціям змінювати дані, прочитані поточною транзакцією. ЧИТАЙТЕ НЕЗАБАВЛЕННІ транзакції також не блокуються ексклюзивними блокуваннями, які заважають поточній транзакції читати рядки, які були змінені, але не вчинені іншими транзакціями. [...]
READ_COMMITED:
- Якщо для параметра READ_COMMITTED_SNAPSHOT встановлено значення OFF (за замовчуванням): використовуються спільні блокування для запобігання зміни інших рядків транзакцій під час виконання поточної транзакції. Спільні блокування також блокують оператор з читання рядків, модифікованих іншими транзакціями, поки інша транзакція не буде завершена. [...] Блокування рядків звільняється до обробки наступного рядка. [...]
- Якщо для параметра READ_COMMITTED_SNAPSHOT встановлено значення УВІМКНЕНО, двигун баз даних використовує версію рядків, щоб представити кожному оператору транзакційно послідовний знімок даних, як він існував на початку оператора. Блоки не використовуються для захисту даних від оновлень іншими транзакціями.
REPETEABLE_READ: Спільні блокування розміщуються на всіх даних, прочитаних кожним оператором транзакції, і зберігаються до завершення транзакції.
СЕРІАЛІЗАЦІЙНІ: Блокування діапазону розміщується в діапазоні ключових значень, що відповідають умовам пошуку кожного оператора, виконаного в транзакції. [...] Блокування діапазону зберігається до завершення транзакції.