Уровень изолированности транзакций в MySQL 8 по умолчанию REPEATABLE READ.
https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
Стандарт SQL определяет четыре уровня изоляции транзакций:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
Транзакция — это набор запросов к базе данных, который или выполняется целиком или не выполняется вовсе, если на одном из шагов произошла ошибка. При сбое все выполненные до момента ошибки инструкции откатываются.
Изолированность транзакции показывает то, насколько сильно влияют друг на друга параллельно выполняющиеся транзакции.
Стандарт SQL описывает следующие особые условия, недопустимые для различных уровней изоляции:
- Грязное чтение. Транзакция читает данные, записанные параллельной незавершённой транзакцией.
- Неповторяемое чтение. Транзакция повторно читает те же данные, что и раньше, и обнаруживает, что они были изменены другой транзакцией, которая завершилась после первого чтения.
- Фантомное чтение. Транзакция повторно выполняет запрос, возвращающий набор строк для некоторого условия, и обнаруживает, что набор строк, удовлетворяющих условию, изменился из-за транзакции, завершившейся за это время.
- Аномалия сериализации. Результат успешной фиксации группы транзакций оказывается несогласованным при всевозможных вариантах исполнения этих транзакций по очереди.
READ UNCOMMITTED — уровень, имеющий самую высокую скорость выполнения транзакций и самую плохую согласованность данных. Каждая транзакция видит незафиксированные изменения другой транзакции (грязное чтение).
READ COMMITTED — уровень, при котором транзакции видят только зафиксированные изменения из других транзакций. Обеспечивает защиту от грязного чтения.
REPEATABLE READ — уровень, позволяющий предотвратить феномен неповторяющегося чтения. Видим новые записи из незафиксированных транзакций, но не видим изменённые и удалённые данные.
SERIALIZABLE — уровень, имеющий самую низкую скорость выполнения транзакций и самую высокую согласованность данных. На этом уровне моделируется последовательное выполнение всех зафиксированных транзакций, как если бы транзакции выполнялись одна за другой, последовательно, а не параллельно. Избавляет от фантомного чтения.
Уровень изоляции | Грязное чтение | Неповторяемое чтение | Фантомное чтение | Аномалия сериализации |
READ UNCOMMITTED | + | + | + | + |
READ COMMITTED | - | + | + | + |
REPEATABLE READ | - | - | + | + |
SERIALIZABLE | - | - | - | - |
Различные веб приложения могут допускать различные уровни изоляции транзакций. Вот, например, Drupal, предлагает установить уровень изоляции REPEATABLE READ. А у меня по умолчанию MySQL 8 использует по умолчанию REPEATABLE READ.
Drupal предлагает некие инструкции по изменению переменных:
Однако, инструкции странноваты.
Через Workbench можно найти переменную transaction_isolation.
Можно посмотреть значение переменной запросом:
show variables WHERE Variable_name LIKE "%_isolation";
Временно можно установить значение запросом:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
Однако, после перезапуска MySQL значение снова изменится. Мне бы хотелось установить постоянное значение. Изменю его в my.ini, путь к файлу можно посмотреть на странице статуса сервера в Workbench.
Находим блок [mysqld] и добавляем:
transaction_isolation="READ-COMMITTED"
Раньше эта переменная называлась tx_isolation, но в MySQL 8 название изменилось на transaction_isolation.
Перезапускаем службу MySQL 8. Уровень изоляции транзакций глобально изменился.
MariaDB
В MariaDB я это дело добавил в /etc/mysql/mariadb.conf.d/50-server.cnf.