Файл: Лабораторная работа 6 " Транзакции и согласованность базы данных".pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.11.2023
Просмотров: 16
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
ФГБОУ ВО “МОСКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ”
Лабораторная работа №6
“ Транзакции и согласованность базы данных” по дисциплине:
Основы базы данных
Выполнил студент 1 курса группы 221–322
Кухаренко Я. И.
Проверила
____________ Никишина И. Н.
МОСКВА 2022
Пример транзакции
Упражнение 6.1
Шаг 1: запустим транзакцию
Шаг 2: вставим новое бронирование в таблицу бронирований с сегодняшней датой
Шаг 3: вставим два электронных билета в таблицу билетов
Шаг 4: откат транзакции
Шаг 5: убедимся, что в таблицах бронирования и билетов не осталось данных
Упражнение 6.2
Делаем все то же самое, только добавляем точки сохранения перед созданием билетов:
Затем совершаем откат:
Убеждаемся, что сохранился только первый билет:
Упражнение 6.3
Без добавления третьего билета мы убедились, что вернуться нельзя:
Уровень изоляции Read Committed
Упражнение 6.4
Сессия 1
Шаг 1: проверяем, что в таблице бронирований нет бронирований на общую сумму 1 000 рублей
Шаг 2: начали транзакцию и обновили таблицу бронирования: удвоили сумму total_amount в тех строках, где сумма равна 1 000 руб.
Сессия 2
Шаг 1: Вставьте новое бронирование на 1 000 рублей в таблицу бронирований и зафиксируем транзакцию.
Сессия 1
Шаг 3: снова обновим таблицу бронирований и зафиксируем транзакцию.
Шаг 4: Проверьте, по-прежнему ли добавленная сумма бронирования равна 1 000 руб.
Уровень изоляции Repeatable Read
Упражнение 6.5
Из-за изоляции не обновилось.
Упражнение 6.6
Сессия 1
Сессия 2
В описанном выше сценарии результат выполненных транзакций может совпадать с ожиданиями. Транзакция с уровнем изоляции Repeatable Read гарантирует, что любые данные, прочитанные в рамках транзакции, останутся неизменными, даже если они будут прочитаны несколько раз в течение транзакции. Однако она может не увидеть новые вставленные записи из других сессий до тех пор, пока транзакция не будет зафиксирована.
Что касается сериализуемости, то можно представить себе порядок последовательного выполнения этих транзакций, который приведет к тому же результату, что и параллельное выполнение. Например, если вы выполните транзакции одну за другой в следующем порядке: Сеанс 1 (Шаг 1
- Шаг 5), а затем Сеанс 2 (Шаг 1 - Шаг 5), то результат будет таким же, как и при параллельном выполнении.
Уровень изоляции Serializable
Упражнение 6.7
Сессия 1
Сессия 2
В этом сценарии ошибка может возникнуть при попытке зафиксировать транзакцию в сеансе 1 или сеансе 2. Это происходит потому, что уровень изоляции Serializable обнаруживает конфликт между параллельными транзакциями, что может привести к противоречивым результатам, если обе транзакции будут разрешены.
Основное различие между уровнями изоляции Repeatable Read и Serializable заключается в том, что Repeatable Read гарантирует, что любые данные, прочитанные в рамках транзакции, остаются последовательными на протяжении всей транзакции, даже если они прочитаны несколько раз.
Однако он может не увидеть новые вставленные данные из других сессий до тех пор, пока транзакция не будет зафиксирована. С другой стороны, уровень изоляции Serializable обеспечивает самый высокий уровень изоляции, при котором любые транзакции, выполняемые одновременно, имеют такой же эффект, как если бы они выполнялись одна за другой, предотвращая любые конфликты или несоответствия между ними.
В предыдущем упражнении с уровнем изоляции Repeatable Read транзакции могли выполняться без обнаружения каких-либо конфликтов или несоответствий. Однако при использовании уровня изоляции Serializable система баз данных обнаруживает потенциальный конфликт и выдает ошибку, гарантируя, что транзакции действительно сериализуемы.
Вложенные транзакции
Упражнение 6.8
Запустим внешнюю транзакцию и выполним некоторые команды внутри внешней транзакции, например вставку данных в таблицу:
Создадим точку сохранения для запуска "вложенной" транзакции:
Выполним некоторые команды внутри "вложенной" транзакции, например обновление таблицы:
Если вы хотите откатить "вложенную" транзакцию, но сохранить активной внешнюю транзакцию, используйте команду ROLLBACK TO:
Зафиксируйте внешнюю транзакцию (при этом будут зафиксированы изменения, внесенные вложенной транзакцией, если вы не откатились к точке сохранения):