Перейти к основному содержанию

MySQL 8 — установка Transaction Isolation Level

MySQL 8

Уровень изолированности транзакций в 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

Drupal предлагает некие инструкции по изменению переменных:

https://www.drupal.org/docs/getting-started/system-requirements/setting-the-mysql-transaction-isolation-level

Однако, инструкции странноваты.

Через Workbench можно найти переменную transaction_isolation.

drupal

Можно посмотреть значение переменной запросом:

show variables WHERE Variable_name LIKE "%_isolation";

drupal

Временно можно установить значение запросом:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

Однако, после перезапуска MySQL значение снова изменится. Мне бы хотелось установить постоянное значение. Изменю его в my.ini, путь к файлу можно посмотреть на странице статуса сервера в Workbench.

drupal

Находим блок [mysqld] и добавляем:

transaction_isolation="READ-COMMITTED"

Раньше эта переменная называлась tx_isolation, но в MySQL 8 название изменилось на transaction_isolation.

drupal

Перезапускаем службу MySQL 8. Уровень изоляции транзакций глобально изменился.

drupal

MariaDB

В MariaDB я это дело добавил в /etc/mysql/mariadb.conf.d/50-server.cnf.

mysql

Теги

 

Похожие материалы

Переименовать Microsoft SQL Server 2014

Иногда требуется переименовать экземпляр Microsoft SQL Server 2014. Это можно сделать с помощью Microsoft SQL Server Management Studio. Запускаем Management Studio на целевом сервере и логинимся на локальный SQL сервер. Для этого в поле Server name указываем точку "." или "localhost".

Теги