MySQL: уровни изоляции транзакций

Что такое Уровни изоляции транзакций в SQL? Уровни изоляции транзакций — это условное значение, определяющее, какие данные будут получены из базы с множеством параллельных транзакций. Уровней изолированности транзакций содержит ряд значений, проранжированных от наинизшего до наивысшего; более высокий уровень изолированности соответствует лучшей согласованности данных, но его использование может снижать количество физически параллельно выполняемых транзакций. И наоборот, более низкий уровень изолированности позволяет выполнять больше параллельных транзакций, но снижает точность данных. Таким образом, выбирая используемый уровень изолированности транзакций, разработчик информационной системы в определённой мере обеспечивает выбор между скоростью работы и обеспечением гарантированной согласованности получаемых из системы данных.

Пример, есть таблица 

CREATE TABLE test (id INT, value VARCHAR(255)) ENGINE=InnoDB;

Тестовый запрос по таблице

START TRANSACTION;
INSERT INTO test(id, value) VALUES (1, 'test'), (2, 'test 2');
SELECT * FROM test;
COMMIT;
SELECT * FROM test;

Какой ответ выдаст запрос SELECT ?

Первый READ UNCOMMITTED
После команды INSERT данные сразу-же станут доступны для чтения, до вызова команды COMMIT вне транзакции можно получить только что добавленные данные. Это называется dirty read («грязное чтение»). Этот уровень редко используется на практике, да вообще редко кто меняет эти самые уровни.

Второй READ COMMTITED
В данном случае прочитать данные возможно только после вызова COMMIT. При чем внутри транзакции данные тоже будут еще не доступны.
Первый SELECT ничего не вернет, т.к. таблица у нас еще пустая и транзакция не подтверждена.

Третий REPEATABLE READ
Этот уровень используется по умолчанию в MySQL. Отличается от второго тем, что вновь добавленные данные уже будут доступны внутри транзакции, но не будут доступны до подтверждения извне.
Здесь может возникнуть теоретическая проблема «фантомного чтения». Когда внутри одной транзакции происходит чтение данных, другая транзакция в этот момент вставляет новые данные, а первая транзакция снова читает те-же самые данные.

И последний SERIALIZABLE
На данном уровне MySQL блокирует каждую строку над которой происходит какое либо действие, это исключает появление проблемы «фантомов». На самом деле смысла использовать этот уровень нет, т.к. InnoDB и менее популярный Falcon решают эту проблему.

Увидеть текущий уровень изоляции по может команда:

SHOW VARIABLES LIKE '%tx_isolation%';

Чтобы установить уровень изоляции, нужно выполнить команды: 

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *