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

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

Теги

 

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

Включаем Database Mail в Microsoft SQL Server 2014

Для того чтобы MSSQL сервер мог слать уведомления на почту, необходимо настроить Database Mail фичу. Для чего нужны уведомления? Я, например, хочу получать письмо, когда заканчивается бэкап. Функционал этой фичи на самом деле гораздо богаче. При сноровке можно по почте слать SQL запросы и получать результаты. В моём случае это не требуется.

Теги