Готовые отчеты / Базы данных. Лабораторная работа 4
.pdfФедеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Факультет инфокоммуникационных сетей и систем Кафедра фотоники и линий связи
ЛАБОРАТОРНАЯ РАБОТА №4 по дисциплине «Базы данных» на тему «Транзакции в MySQL»
Выполнили: студенты 3-го курса дневного отделения группы ИКПИ-85 Ежуров Антон Павлович
Коваленко Леонид Александрович Преподаватель:
ассистент кафедры ПИиВТ Овчинников Антон Олегович
Санкт-Петербург
2020
Цель работы Получить практические навыки в работе с транзакциями и их
свойствами.
Ход работы
Создадим базу данных university в программе-дизайнере MySQL Workbench. В этой базе данных создадим таблицу users с полями:
1.id типа INT, первичный ключ (PK), счетчик (AI);
2.name типа VARCHAR, ненулевое (NN);
3.department_id типа INT.
Заполним таблицу users произвольными пятью записями (табл. 1). Таблица 1 — Таблица users базы данных university
id |
name |
department_id |
|
|
|
1 |
Алексей |
1 |
|
|
|
2 |
Михаил |
2 |
|
|
|
3 |
Елена |
3 |
|
|
|
4 |
Василий |
4 |
|
|
|
5 |
Владимир |
5 |
Сохраним созданную в программе-дизайнере схему базы данных на локальный компьютер.
Запустим генерацию базы данных на сервере MySQL (Пункт меню: Database → Forward Engineer). В опциях поставим галки напротив пунктов
Generate INSERT statements for tables и DROP objects before each CREATE object.
mysql -u root -p) и
активизируем базу данных university (команда use university). В командной строке выполним следующие команды (рис. 1):
SET AUTOCOMMIT=0; # Отключение |
режима автокоммита |
|
|
SELECT * FROM users; # Выводим |
5 |
строк из таблицы |
users |
START TRANSACTION; # Начинаем транзакцию |
|
||
SAVEPOINT sve_point; # Сохраняем |
текущее состояние как sve_point |
||
DELETE FROM users; # Удаляем все |
строки таблицы users |
||
SELECT * FROM users; # Выводим |
0 |
строк из таблицы |
users |
ROLLBACK TO SAVEPOINT sve_point; |
# Возвращаемся к |
sve_point |
2
SELECT * FROM users; # Выводим 5 строк из таблицы users DELETE FROM users; # Удаляем все строки таблицы users SELECT * FROM users; # Выводим 0 строк из таблицы users exit; # Выход из mysql
Рисунок 1 — Результат выполнения команд
Подключимся к базе данных MySQL (команда mysql -u root -p) и активизируем базу данных university (команда use university).
В командной строке выполним следующие команды (рис. 2):
SET AUTOCOMMIT=0; # Отключение режима автокоммита SELECT * FROM users; # Выводим 5 строк из таблицы users
Рисунок 2 — Результат выполнения команд В командной строке выполним следующие команды (рис. 3):
3
START TRANSACTION; # Начинаем транзакцию
# Добавляем в таблицу users новую строку
INSERT INTO users (id, name, department_id) VALUES (100, 'Antonio', 1);
COMMIT; # Сохранение изменений
SELECT * FROM users; # Выводим 6 строк из таблицы users exit; # Выход из mysql
Рисунок 3 — Результат выполнения команд
Подключимся к базе данных MySQL (команда mysql -u root -p) и активизируем базу данных university (команда use university).
В командной строке выполним команду (рис. 4):
SELECT * FROM users; # Выводим 6 строк из таблицы users
Рисунок 4 — Результат выполнения команд
4
Выводы Транзакция — минимальная логически осмысленная операция, которая
имеет смысл и может быть совершена только полностью.
Транзакция начинается со специального запроса START TRANSACTION. Чтобы закончить транзакцию, нужно либо зафиксировать изменения
(запрос COMMIT), либо откатить их (запрос ROLLBACK).
В MySQL не существует механизма вложенных транзакций. Одно соединение с БД — одна транзакция. Новая транзакция в пределах одного соединения может начаться только после завершения предыдущей.
ACID описывает требования к транзакционной системе (например, к СУБД), обеспечивающие наиболее надёжную и предсказуемую её работу.
Atomicity — Атомарность. Атомарность гарантирует, что никакая транзакция не будет зафиксирована в системе частично.
Consistency — Согласованность. Транзакция, достигающая своего нормального завершения (EOT — end of transaction, завершение транзакции) и, тем самым, фиксирующая свои результаты, сохраняет согласованность базы данных. Например, в банковской системе может существовать требование равенства суммы, списываемой с одного счёта, сумме, зачисляемой на другой.
Isolation — Изолированность. Во время выполнения транзакции параллельные транзакции не должны оказывать влияния на её результат.
Durability — Стойкость. Независимо от проблем на нижних уровнях (к примеру, обесточивание системы или сбои в оборудовании) изменения, сделанные успешно завершённой транзакцией, должны остаться сохранёнными после возвращения системы в работу.
У транзакций есть 4 уровня изоляции:
0 — Чтение неподтверждённых данных (грязное чтение) (Read Uncommitted, Dirty Read) — самый низкий уровень изоляции. При этом уровне возможно чтение незафиксированных изменений параллельных транзакций. Как раз в этом случае второй пользователь увидит вставленную запись из первой незафиксированной транзакции. Нет гарантии, что
5
незафиксированная транзакция будет в любой момент откачена, поэтому такое чтение является потенциальным источником ошибок.
1 — Чтение подтверждённых данных (Read Committed) — здесь возможно чтение данных только зафиксированных транзакций. Но на этом уровне существуют две проблемы. В этом режиме строки, которые участвуют в выборке в рамках транзакции, для других параллельных транзакций не блокируются, из этого вытекает проблема №1: «Неповторяемое чтение» (non-repeatable read) — это ситуация, когда в рамках транзакции происходит несколько выборок (SELECT) по одним и тем же критериям, и между этими выборками совершается параллельная транзакция, которая изменяет данные, участвующие в этих выборках. Так как параллельная транзакция изменила данные, результат при следующей выборке по тем же критериям в первой транзакции будет другой. Проблема №2 — «Фантомное чтение» — этот случай рассмотрен ниже.
2 — Повторяемое чтение (Repeatable Read, Snapshot) — на этом уровне изоляции так же возможно чтение данных только зафиксированных транзакций. Так же на этом уровне отсутствует проблема «Неповторяемого чтения», то есть строки, которые участвуют в выборке в рамках транзакции, блокируются и не могут быть изменены другими параллельными транзакциями. Но таблицы целиком не блокируются. Из-за этого остается проблема «фантомного чтения». «Фантомное чтение» — это когда за время выполнения одной транзакции результат одних и тех же выборок может меняться по причине того, что блокируется не вся таблица, а только те строки, которые участвуют в выборке. Это означает, что параллельные транзакции могут вставлять строки в таблицу, в которой совершается выборка, поэтому два запроса SELECT * FROM table могут дать разный результат в разное время при вставке данных параллельными транзакциями.
3 — Сериализуемый (Serializable) — сериализуемые транзакции. Самый надежный уровень изоляции транзакций, но и при этом самый медленный. На этом уровне вообще отсутствуют какие-либо проблемы
6
параллельных транзакций, но за это придется платить быстродействием системы, а быстродействие в большинстве случаев крайне важно.
По умолчанию в MySQL установлен уровень изоляции №2 (Repeatable Read). Разработчики MySQL не зря сделали по умолчанию именно этот уровень, так как он наиболее оптимальный для большинства случаев.
Если AUTOCOMMIT установлен в значение false (0) и транзакция не выполнена, изменения будут видны только для текущего соединения. После того, как инструкция COMMIT фиксирует изменения в таблице, результат будет видимым для всех подключений. Если значение AUTOCOMMIT установлено верно, то COMMIT и ROLLBACK бесполезны.
7