и READ UNCOMMITTED блокируются только существующие строки, удовлетворяющие условию фильтрации. На уровне REPEATABLE READ используются диапазонные блокировки, что исключает возможность появления фантомов.
6.1.4. Общие сведения о MySQL
MySQL – клиент-серверная система управления базами данных. Это означает, что СУБД выполняется в виде процесса и имеет полный доступ к базе данных, тогда как другие приложения при необходимости работать с данными обязаны формировать запросы и отправлять их процессу СУБД.
MySQL имеет в распоряжении несколько движков: InnoDB, MyISAM, XtraDB и другие.
В контексте рассмотрения механизмов управления транзакциями, наибольший интерес представляет ACID-совместимый движок InnoDB, который является который с 2010 года (MySQL 5.5) является движком по умолчанию для таблиц.
6.2. Рекомендации по выполнению лабораторной работы
Задания выполняются с использованием сервера MySQL версии 5.5 или выше. В качестве клиента можно использовать либо поставляемую с сервером утилиту командной строки mysql, либо официальный инструментарий MySQL Workbench, либо стороннее ПО, например, dbForge Studio for MySQL или HeidiSQL. При использовании ПО с графическим интерфейсом пользователя задания выполняются в окне редактора SQL-запросов.
Влабораторной работе необходимо отключить интерактивный режим выполнения запросов, в котором работают все клиенты MySQL. В этом режиме каждый оператор SQL, обрабатываемый клиентом, облекается в отдельную транзакцию, которая автоматически фиксируется после его выполнения (т.н. режим автофискации, autocommit). В лабораторной работе исследуются методы разрешения зависимостей между параллельно (т.е. одновременно) выполняющимися транзакциями, обращающимися к одним и тем же данным, поэтому транзакции должны состоять из нескольких операторов и выполняться продолжительное время.
Винтерфейсе командной строки или редакторе SQL начать транзакцию без автофиксации можно выполнив команду BEGIN.
26
В MySQL Workbench можно достичь того же, отключив режим автофиксации транзакций (Auto-Commit Transactions), после чего все выполняемые операторы будут объединены в одну транзакцию, а также станут доступны команды фиксации и отката текущей транзакции (рис. 6.1).
Те же элементы управления продублированы на панели инструментов (рис. 6.2).
В dbForge Studio for MySQL по умолчанию также включен режим автофиксации. Можно отключив его, нажав на кнопку начала транзакции или выбрав соответствующий элемент контекстного меню соединения (рис. 6.3).
После этого становятся доступны команды фиксации и отката текущей транзакции (рис. 6.4).
Рис. 6.1. Команды управления транзакциями в меню MySQL Workbench
Рис. 6.2. Команды управления транзакциями на панели инструментов MySQL Workbench
27
Рис. 6.3. Команды управления транзакциями в меню dbForge Studio for MySQL
Рис. 6.4. Команды управления транзакциями на панели инструментов dbForge Studio for MySQL
Рис. 6.5. Команда открытия нового подключения в MySQL Workbench
Рис. 6.6. Команда открытия нового подключения в dbForge Studio for MySQL
28
Для заданий задан уровень изоляции (RU – READ UNCOMMITTED, RC – READ COMMITTED, RR – REPEATABLE READ). Необходимо установить в подключении соответствующий уровень изоляции:
-- для следующей транзакции:
SET TRANSACTION ISOLATION LEVEL уровень;
-- для всех последующих транзакций данного подключения: SET SESSION TRANSACTION ISOLATION LEVEL уровень
Затем необходимо запустить второе подключение к той же БД. Уровень изоляции можно оставить по умолчанию (в InnoDB это REPEATABLE READ, если не изменялись настройки).
ВMySQL Workbench для открытия второго подключения необходимо повторно выполнить команду Open Connection для созданного подключения к базе данных (рис. 6.5). Оно создастся в соседней вкладке.
ВdbForge Studio for MySQL второе подключение открывается командой дублирования соединения (рис. 6.6).
Следует отметить, что в MySQL Workbench по умолчанию включен так называемый «безопасный режим» обновлений и удалений, который заключается в том, что выполняются только те команды UPDATE и DELETE, которые в секции WHERE содержат условие фильтрации по ключевому полю. Считается, что это позволит избежать ошибочного изменения или удаления многих строк сразу неопытными пользователями. Поскольку для выполнения работы иногда необходимо фильтровать запросы не по ключевому полю, данный режим следует отключить. Для этого необходимо зайти в меню настроек среды (Edit -> Preferences...) и на вкладке «SQL Editor» снять галочку «Safe Updates» (рис. 6.7).
Параллельно запускаются две транзакции из двух открытых подключений. Первая транзакция T1 (из подключения с уровнем изоляции согласно варианту) производит операции с данными, после чего вторая транзакция T2 также работает с этими данными
итак далее. Список действий должен полностью представлять реакцию системы на зависимости между транзакциями.
Для каждого варианта необходимо проанализировать: 1) Зависимость потерянного обновления
T1 |
T2 |
read(x) |
write(x) |
|
write(x)
2) Зависимость грязного чтения
T1 T2 write(x)
read(x)
write(x)
29
Рис. 6.7. Управление «безопасным режимом» в MySQL Workbench
3) Зависимость неповторяемого чтения
T1 T2 read(x)
write(x)
read(x)
4) Зависимость фантомов
T1 T2 filter(t)
add(t)
filter(t)
Задания MVCC связаны с исследованием механизма многоверсионности для движка InnoDB. При этом транзакцией T1 производятся целостные неблокирующие чтения (в InnoDB – обычный оператор SELECT).
30