You are on page 1of 11

Горбань Ю. В.

КІ-18
Лабораторна робота № 8.
Тема: Транзакції та блокування. Рівні ізоляції.
Мета: Порівняти роботу СУБД на різних рівнях ізоляції.

Хід виконання

1. Запустити програму SQL Shell (psql.


2. Для назви сервера, бази даних, порта та користувача використати значення
за умовченням, ввести значення пароля
3. Створити базу даних lab8.

Рисунок 8.1 – Створення БД

4. Підключитися до цієї бази даних.

Рисунок 8.2 – Підключення до БД

5. Створити таблицю tranc з одним стовпчиком цілого типу.

Рисунок 8.3 – Створенняя таблиці

6. Заповнити цю таблицю довільною інформацією так, щоб вона мала не


менше 20 рядків (у psql або у pgAdmin4). Вивести на екран всі значення.
Горбань Ю. В. КІ-18

Рисунок 8.4 – Заповнення таблиці


7. Виконати команди:
begin;
set transaction isolation level read uncommitted;
які створюють транзакцію із рівнем ізоляції read uncommitted

Рисунок 8.5 – Початок транзакції із рівнем ізоляції read uncommitted

8. Робота першої транзакції буде складатися із оновлення даних та перегляду


нового стану таблиці, наприклад:
update public.tranc set inf=inf+5; (замість 5 додайте свій номер варіанта)
select* from public.tranc;

Рисунок 8.6 – Оновлення даних


Горбань Ю. В. КІ-18

9. Розпочинаємо транзакцію на другому терміналі, повторюючи п.7

Рисунок 8.5 – Початок паралельної транзакції із рівнем ізоляції read


uncommitted

Рисунок 8.6 – Дані

10. Не будемо фіксувати виконані зміни, скористаємося командою відміни


транзакції на обох терміналах ROLLBACK;

Рисунок 8.7 – Відміна транзакції

11. Для ілюстрації роботи рівня ізоляції read committed нехай перша
транзакція збільшує дані в таблиці tranc вдвічі, а друга втричі. На першому
терміналі розпочинаємо транзакцію:
Горбань Ю. В. КІ-18
begin;
set transaction isolation level read committed;

Рисунок 8.8 – Початок паралельної транзакції із рівнем ізоляції read


committed

12. Замість використання команд у п.11 у PostgreSQL припустимо


використовувати скорочену версію begin isolation level read committed; що і
застосуємо для другого термінала

Рисунок 8.9 – Початок паралельної транзакції із рівнем ізоляції read


committed

13. Завершимо першу транзакцію з фіксацією змін.


Горбань Ю. В. КІ-18

Рисунок 8.10 – Завершення транзакції

Оновлення на другому терміналі також завершилось.


Не закінчуючи другу транзакцію подивимося, чи змінилися дані

Рисунок 8.11 – Оновлені дані

14. Розглянемо рівень ізоляції repeatable read.


Горбань Ю. В. КІ-18

Рисунок 8.12 – Початок транзакції із рівнем ізоляції repeatable read

Спробуємо на другому терміналі також зробити оновлення

Рисунок 8.13 – Оновлення

Рисунок 8.14 – Помилка виконання другої транзакції

15. Самостійно дослідити рівень ізоляції serializable (команда begin isolation


level serializable;)
Горбань Ю. В. КІ-18

Рисунок 8.15 – Транзакції з рівнем ізоляції serializable

Зміни, що були зроблені в першій транзакції, не доступні іншим транзакціям

Запит на зміну даних у першій транзакції блокує всі рядки, що оновлюються


та переводить другу транзакцію в режим очікування.

Рисунок 8.16 – Очікування завершення однієї з транзакцій

Завершення першої транзакції знімає блокування, але рівень блокування Seri-


alizable забороняє паралельну зміну даних, тому виникає помилка виконання
другої транзакції.
Горбань Ю. В. КІ-18

Рисунок 8.17 – Помилка виконання транзакції

16. Навести приклади застосування різних рівнів ізоляції для транзакцій


до своєї БД.

Почнемо дві паралельні транзакції з рівнем ізоляції read commited.

Рисунок 8.18 – Початок транзакцій

До внесення змін в обох транзакціях доступна однакова інформація.

Рисунок 8.19 – Зміна даних

Після внесення змін, оновлені дані доступні лише в першій транзакції

Рисунок 8.20 – Порівняння даних у різних транзакціях


Горбань Ю. В. КІ-18

Після завершення першої транзакції, зміни що зроблено в результаті її


виконання, можна бачити в другій транзакції.

Рисунок 8.21 – Оновлені дані


Почнемо дві транзакції з рівнем ізоляції repeatable read

Рисунок 8.22 – Початок транзакцій

Після внесення змін в першій транзакції, у другій можна бачити дані до


оновлення.

Рисунок 8.23 – Внесення змін

Виконаємо завершення першої транзакції. У другій транзакції, через те, що


встановлено рівень блокування repeatable read, все ще відображаються дані,
що були до внесення змін у першій транзакції.
Горбань Ю. В. КІ-18

Рисунок 8.24 – Завершення транзакції

Оновлені дані у другому підключенні можна побачити лише після


завершення другої транзакції.

Рисунок 8.25 – Оновлені дані

Запустимо дві транзакції з рівнем ізоляції read uncommitted.

Рисунок 8.26 – Початок транзакцій


Внесемо зміни до таблиці та переглянемо її вміст в обох транзакціях.

Рисунок 8.27 – Перегляд таблиці

Можна бачити, що у другій транзакції все ще відображаються дані до їх змін,


навіть попри те, що встановлено рівень ізоляції read uncommitted. Згідно з
Горбань Ю. В. КІ-18
офіційною документацією, рівень ізоляції read uncommitted працює так само
як і read committed, тому в СУБД PostgreSQL існує лише три рівня ізоляції.

Висновок: в ході лабораторної роботи було досліджено існуючі рівні ізоляції


в СУБД PostgreSQL та виконано їх порівняння.

You might also like